2012-08-26 14 views
14

PostgreSQLで関数を削除するSQLを取得します。私はDROP FUNCTIONとget関数名はpg_procから書いています。それは問題ではありません。しかし空白のパラメータを残しておけば、関数を削除することはありません。関数のパラメータリストを取得する方法(関数を削除できるように)

私はマニュアルをチェックして書かれているので、そのパラメータをドロップするパラメータを指定しなければなりません。たとえば、だけでなく、DROP FUNCTION some_func(text,integer)です。

どこでパラメータを見つけることができますか? pg_procテーブルの関数の行には、パラメータはありません。だから私はどのように関数を削除するSQLを取得できますか?

+2

pgAdminで関数を見てください。 –

+2

'' psql'の中の '\ df name'(http://www.postgresql。org/docs/current/static/app-psql.html)。 –

答えて

24

Postgresには、その目的のための専用の機能があります。 Postgres 8.4で導入されました。

pg_get_function_identity_arguments(func_oid)The manual:

...(デフォルト値なし)機能を識別するために、引数リストを取得...

pg_get_function_identity_arguments戻り引数リスト 形でそれが必要になり、機能を識別するために必要な例えば、がALTER FUNCTIONの範囲内に表示されます。このフォームはデフォルト値を省略します。

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; 

戻り値:

4見つかり
    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); 

(およびformat()、Postgresの9.1で導入された)、次のクエリは、検索語に一致する関数をドロップするDDL文を生成することを利用し

この例ではdblinkはoverloaded functionsを使用しているため一致します。
DROPステートメントを選択的に実行してください。

また、あなたは引数の型を含む完全な関数のシグネチャを返すobject identifier type 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; 
+2

....これが私が大好きな理由です。 4年間のようなもののためにPgを使用して、私はそれについて知らなかった。甘い。 –

+0

ありがとう、これはまさに私が探しているものです。すばらしいです! – John

1

を選択しpgadminIIIと機能のリストへの直接アクセスを使用し、それを右クリックdelete enter image description here

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)" 
関連する問題