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

パッケージ本体からプライベートプロシージャ/関数のリストを取得します

    プライベート関数の性質は、それらがプライベートであるということです。デフォルトでそれらを公開するデータディクショナリビューはありません。 USER_PROCEDURESおよびUSER_ARGUMENTSは、パブリックプロシージャ(パッケージspec0で定義されているプロシージャ)の情報のみを表示します。

    ただし、PL / SCOPEを使用してそれらに関する情報を取得することはできますが、そのためには少し追加の作業が必要です。

    1. SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
    2. SQL> alter package your_package compile body;

    これで、次のクエリを使用してプライベートプログラムユニットを見つけることができます:

    select ui.type, ui.name, ui.usage_id
    from user_identifiers ui
    where ui.object_name = 'YOUR_PACKAGE'
    and ui.usage = 'DEFINITION'
    and ui.type in ('PROCEDURE', 'FUNCTION')
    minus
    ( select 'PROCEDURE', upr.procedure_name 
      from user_procedures upr
      where upr.object_name = 'YOUR_PACKAGE'
      union
      select 'FUNCTION', uarg.object_name
      from user_arguments uarg
      where uarg.package_name = 'YOUR_PACKAGE'
      and uarg.position = 0 
    );
    

    プライベートプロシージャの引数を取得するには、前のクエリのUSAGE_IDをこのクエリにプラグインします。

    select ui.name
           , ui.type
           , ui.usage_id
           , ui2.type as param_datatype
    from user_identifiers ui
         left join user_identifiers ui2
            on ui2.usage_context_id = ui.usage_id 
    where ui.object_name = 'YOUR_PACKAGE'
    and ui.usage = 'DECLARATION'
    and ui.usage_context_id = :private_proc_usage_id
    /
    

    user_identifiersのため、これは左結合である必要があります スカラーデータ型(文字、数値、日付、clob)のデータ型エントリがありますが、複雑なデータ型(xmltype、ユーザー定義型)はありません。

    USER_PROCEDURESやUSER_ARGUMENTSを照会するほど簡単ではありませんが、PL / SCOPEからプロシージャに関する多くの情報を取得できます(実際、驚くほど不格好です)。詳細をご覧ください。 PL / SCOPEデータはSYSAUX表領域に格納されるため、DBAでお湯に浸からないように注意してください。




    1. 別のテーブルに行を挿入するようにMySQLトリガーをプログラムするにはどうすればよいですか?

    2. Postgresがランダムに動作を停止しました(Rails、PGSQL.5432)

    3. バッファキャッシュ:それは何であり、データベースのパフォーマンスにどのように影響しますか?

    4. PgbackrestRestoreおよびRestoreDelta