PL/SQL クエリを記述して、ストアド プロシージャの依存関係の完全なリストを特定することはできますか? 私は他のストアド プロシージャを特定することにのみ関心があり、ネストの深さも制限したくありません。たとえば、A が B を呼び出し、B が C を呼び出し、C が D を呼び出す場合、B、C、および D を A の依存関係として報告する必要があります。
7162 次
4 に答える
8
このページには、 PUBLIC_DEPENDENCYディクショナリ テーブルを使用する次のクエリがあります。
SELECT lvl
, u.object_id
, u.object_type
, LPAD (' ', lvl) || object_name obj
FROM ( SELECT LEVEL lvl, object_id
FROM SYS.public_dependency s
START WITH s.object_id =
( SELECT object_id
FROM user_objects
WHERE object_name = UPPER ('&OBJECT_NAME')
AND object_type = UPPER ('&OBJECT_TYPE'))
CONNECT BY s.object_id = PRIOR referenced_object_id
GROUP BY LEVEL, object_id) tree
, user_objects u
WHERE tree.object_id = u.object_id
ORDER BY lvl
/
于 2008-11-18T00:45:51.587 に答える
2
ここで指摘する価値のある他のことは、依存関係が実行時にのみ存在する可能性がある特定のケースがあり、残念ながらメタデータに表示されないことです。
たとえば、実行時にSQLステートメントを作成する場合、次のようなコードが含まれる可能性があります。
...
mysql := 'select count(*) from '||table_name_in;
execute immediate mysql;
...
私はこれに何度か悩まされてきましたが、残念ながら、これらのタイプの依存関係はユーザー入力に依存する可能性があるため、事前に見つける方法はありません。
于 2008-12-29T04:16:25.570 に答える
2
EddieAwadに同意します。
Oracle は依存関係をオブジェクト レベルまでしか追跡しないことに注意してください。パッケージ内にストアド プロシージャがある場合、パッケージ内の個々の関数/プロシージャではなく、パッケージの依存関係のみを追跡できます。
パッケージ内の依存関係を追跡する場合は、PLSQL パーサーが必要です。
于 2008-11-18T04:37:46.657 に答える
2
すべての詳細を取得するには:
select * from all_dependencies where owner = '&OWNER' and NAME='&OBJECT_NAME'
于 2011-04-13T12:13:59.723 に答える