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

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

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

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

4 ответа

Postgres имеет специальную функцию для этой цели. Представлено с Postgres 8.4. Руководство:

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

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

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

SELECT format('DROP %s %I.%I(%s)'
            , CASE WHEN p.proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , n.nspname
            , 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  p.proname = 'dblink'                     -- function name
-- AND n.nspname = 'public'                     -- schema name (optional)
-- 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 использует перегруженные функции.
Бежать DROP заявления выборочно!

Кроме того, вы можете использовать удобное приведение к типу идентификатора объекта regprocedure которая возвращает полную сигнатуру функции, включая типы аргументов:

-- SET LOCAL search_path = '';  -- optional, to get all names schema-qualified
SELECT format('DROP %s %s;'
            , CASE WHEN proisagg THEN 'AGGREGATE' ELSE 'FUNCTION' END
            , oid::regprocedure
             ) AS stmt
FROM   pg_catalog.pg_proc
WHERE  proname = 'dblink'   -- function name
ORDER  BY 1;

В Postgres 10 вы можете удалить функцию, не зная списка параметров, если она уникальна в своей схеме.

drop function if exists some_func;

Смотрите документы.

Конечно, если вы перегрузили функцию (или пытаетесь удалить из нескольких схем), вам все равно понадобятся вышеуказанные ответы.

Используйте pgadminIII и прямой доступ к списку функций, щелкните по нему правой кнопкой мыши и выберите "Удалить"введите описание изображения здесь

Если вы работаете над старой предыдущей версией 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)"
Другие вопросы по тегам