Подтвердить что ты не робот

Как получить список параметров функции (так что я могу отказаться от функции)

Я хочу, чтобы SQL сбросил функцию в PostgreSQL. Я пишу DROP FUNCTION и имя функции get из pg_proc. Это не проблема. Однако, если я оставляю пустые параметры, он не откажется от функции.

Я проверил руководство, и там написано, что я должен идентифицировать функцию с ее параметрами, чтобы ее удалить, например DROP FUNCTION some_func(text,integer) не просто DROP FUNCTION some_func.

Где я могу найти параметры? В строке функции в таблице pg_proc нет параметров. Итак, как я могу заставить SQL отказаться от функции?

4b9b3361

Ответ 1

Postgres имеет специальную функцию для этой цели. В документации:

pg_get_function_identity_arguments(func_oid)... получить список аргументов для определения функции (без значений по умолчанию)
...

pg_get_function_identity_arguments возвращает список аргументов необходимо определить функцию, в форме, которая должна появиться в пределах ALTER FUNCTION, например. В этой форме отсутствуют значения по умолчанию.

Используя это, следующий запрос генерирует операторы DDL для отбрасывания функций, соответствующих вашим условиям поиска:

SELECT 'DROP '
    || CASE WHEN p.proisagg THEN 'AGGREGATE ' ELSE 'FUNCTION ' END
    || quote_ident(n.nspname) || '.' || quote_ident(p.proname) || '(' 
    || pg_catalog.pg_get_function_identity_arguments(p.oid) || ');' AS stmt
FROM   pg_catalog.pg_proc p
JOIN   pg_catalog.pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname = 'public'                     -- schema name (optional)
AND    p.proname ILIKE 'crosstab%'              -- function name
-- AND pg_catalog.pg_function_is_visible(p.oid) -- function visible to user
ORDER  BY 1;

Возврат:

                  stmt
---------------------------------------------------
 DROP FUNCTION public.dblink(text);
 DROP FUNCTION public.dblink(text, boolean);
 DROP FUNCTION public.dblink(text, text);
 DROP FUNCTION public.dblink(text, text, boolean); 

Найдено четыре совпадения в примере, потому что dblink использует перегруженные функции.
Выполните операторы DDL выборочно!

Ответ 2

используйте pgadminIII и прямой доступ к списку функций и щелкните его правой кнопкой мыши, затем выберите delete enter image description here

Ответ 3

Если вы работаете над старой предыдущей версией postgres, для которой pg_get_function_identity_arguments (func_oid) не существует, я создаю свою собственную функцию, получая параметры из функции, вам нужно передать только функцию oid для функции, вы вам нужно развернуть функцию ниже до вашего postgres db.

CREATE OR REPLACE FUNCTION public.getFunctionParameter(functionOid oid)
  RETURNS text AS
$BODY$

declare
    t_paras text;
    paras oid[];
    res text :='(';
begin

select proargtypes into t_paras from pg_proc where oid=functionOid;
if t_paras is null or t_paras='' then
    return '()';
else
    paras:=string_to_array(t_paras,' ');
    for i in  array_lower(paras,1) .. array_upper(paras,1)
    loop
        raise notice 'para is %',paras[i];
        select format_type(paras[i]::oid,NULL) into t_paras;
        res:=res||t_paras||',';
    end loop;
    res:=substring(res from 1 for char_length(res)-1);
    res:=res||')';
    return res;
end if;

end 

    $BODY$
      LANGUAGE plpgsql ;

В приведенной ниже функции будут перечислены имя и параметры функции, измените имя схемы, если вы хотите получить функцию в какой-либо другой схеме, я использую public, например

    SELECT n.nspname||'.'||p.proname||public.getFunctionParameter(p.oid)
FROM    pg_proc p JOIN   pg_namespace n ON n.oid = p.pronamespace
WHERE  n.nspname='public' 

Вы получите результат ниже

1 "public.getfunctionparameter(integer,text)"
2 "public.getfunctionparameter(oid)"