sql >> データベース >  >> RDS >> PostgreSQL

関数のパラメーターリストを取得する方法(関数を削除できるようにするため)

    Postgresにはその目的のための専用機能があります。 Postgres8.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;
    

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

    • PostgreSQLですべての関数を削除するにはどうすればよいですか?

    返品:

                      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;
    


    1. mysqlbinlogを使用してMySQLバイナリログファイル(BinLog)を読み取る方法

    2. 1つの表に行がない可能性がある複数の表からの選択によるOracleInsert

    3. OracleのNLS_NCHAR_CHARACTERSETとNLS_CHARACTERSETの違い

    4. 修正方法「関連付けられたパーティション関数は、スキームで言及されているファイルグループよりも多くのパーティションを生成します」SQLServerのメッセージ7707