27

PostgreSQL に関数をドロップする SQL を取得したいと考えています。DROP FUNCTIONからget関数名を書きpg_procます。それは問題ではありません。ただし、パラメーターを空白のままにすると、関数は削除されません。

マニュアルを確認したところ、関数をそのパラメーターで識別してドロップする必要があることが書かれていDROP FUNCTION some_func(text,integer)ますDROP FUNCTION some_func

パラメータはどこにありますか? 表の関数の行にpg_procはパラメータがありません。では、SQL で関数を削除するにはどうすればよいでしょうか。

4

4 に答える 4

39

Postgres にはそのための専用機能があります。Postgres 8.4 で導入されました。マニュアル:

pg_get_function_identity_arguments(func_oid)... 関数を識別するための引数リストを取得します (デフォルト値なし) ...

pg_get_function_identity_argumentsALTER 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;

Postgres 11でシステム カタログpg_procが変更されました。に置き換えられ、真のストアド プロシージャが追加されました。適応する必要があります。見る:proisaggprokind

戻り値:

                  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 はオーバーロードされた関数を使用しているため、この例では 4 つの一致が見つかりました。ステートメントを選択的
に実行してください!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;
于 2012-08-26T04:57:10.600 に答える
0

pg_get_function_identity_arguments(func_oid) が存在しない古いバージョンの postgres で作業している場合、関数からパラメーターを取得する独自の関数を作成します。関数に 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 ;

以下の関数は、関数名とパラメーターをリストします。他のスキーマで関数を取得する場合は、スキーマ名を変更します。たとえば、パブリックを使用しています

    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)"
于 2017-12-28T19:49:38.713 に答える