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

パッケージ宣言の内容

    パッケージ内の関数とプロシージャの詳細については、 ALL_ARGUMENTS データディクショナリビュー、またはその兄弟であるUSER_ARGUMENTSとDBA_ARGUMENTS。

    例として、次のパッケージを作成しました:

    CREATE OR REPLACE PACKAGE demo AS
        PROCEDURE p_none;
        PROCEDURE p_two(a INTEGER, b INTEGER);
    
        FUNCTION f_none RETURN INTEGER;
        FUNCTION f_three(c INTEGER, q INTEGER, z INTEGER) RETURN INTEGER;
    END;
    

    次に、それに対して次のクエリを実行しました:

    SQL> select object_name, argument_name, sequence, in_out
      2    from all_arguments
      3   where package_name = 'DEMO'
      4   order by object_name, sequence;
    
    OBJECT_NAME                    ARGUMENT_NAME                    SEQUENCE IN_OUT
    ------------------------------ ------------------------------ ---------- ---------
    F_NONE                                                                 1 OUT
    F_THREE                                                                1 OUT
    F_THREE                        C                                       2 IN
    F_THREE                        Q                                       3 IN
    F_THREE                        Z                                       4 IN
    P_NONE                                                                 0 IN
    P_TWO                          A                                       1 IN
    P_TWO                          B                                       2 IN
    

    ここでは、パッケージ内の関数とプロシージャに対するすべての引数を確認できます。 2つの関数のそれぞれの戻り値にnull引数名を持つ追加のエントリがあることに注意してください。また、引数のないプロシージャには、引数名がnullでSEQUENCEがゼロの行があります。 値。

    したがって、すべての関数を一覧表示するには、引数名がnullでSEQUENCEを使用してこのビューのすべてのエントリを検索できます。 0に等しくない値:

    SQL> select distinct object_name
      2    from all_arguments
      3   where package_name = 'DEMO'
      4     and argument_name is null
      5     and sequence != 0;
    
    OBJECT_NAME
    ------------------------------
    F_THREE
    F_NONE
    

    同様の方法で手順を一覧表示するのは少し注意が必要です:

    SQL> select distinct object_name
      2    from all_arguments a1
      3   where package_name = 'DEMO'
      4     and (   sequence = 0
      5          or not exists (select 0
      6                           from all_arguments a2
      7                          where a2.package_name = 'DEMO'
      8                            and a2.object_name = a1.object_name
      9                            and a2.argument_name is null));
    
    OBJECT_NAME
    ------------------------------
    P_TWO
    P_NONE
    

    このアプローチはプロシージャと関数で機能するように見えますが、@ wweickerによって提案されているように、パッケージ仕様を解析せずに、パッケージスコープ変数、型、およびパッケージヘッダー内で宣言されたその他のものを一覧表示する方法がわかりません。



    1. pg_dumpおよびpsql-Upostgres db_name <...を使用してデータベースを移動すると、エラーが発生します:リレーションtable_nameは存在しません

    2. PHP PDOは、bindParamを使用して複数(10000以上)の同じ行を挿入します。いい練習?

    3. HerokuでのPumaクラスター構成

    4. 日付を列として動的にピボットする方法