(他のストアドプロシージャで)ストアドプロシージャが使用されている場所をどのように見つけますか


10

何千ものSPを持つデータベースに、リファクタリングしたいストアドプロシージャがあります。他のSPでそのストアドプロシージャへの参照をすばやく見つける方法はありますか?そうすれば、リファクタリングするときに他のコードを壊していないことを確認できます。

アプリケーションコードでは、SPへの呼び出しを簡単に検索でき、SPを定義するさまざまなSQLファイルすべてに対してテキスト検索を実行できますが、データベース内に一部のSPが存在しない可能性があります。 。

編集:私が見つけようとしているストアドプロシージャは、パッケージの一部です。

編集:私はOracle 11gで実行しています

回答:


11

DBA_DEPENDENCIES ビューはそのような質問に対するすべての答えを持っています。

select * from DBA_DEPENDENCIES
  where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';

2
ただし、動的SQLを使用する場合、このアプローチは機能しません。つまり、動的SQLの一部としてプロシージャを実行する場合などです。それ以外の場合は、dba_またはall_dependenciesが適切に機能します。
Raj

1
これは役に立ちます。ユーザーが定義した関数と手順を見つけることはできますが、パッケージで定義されたFNまたはSPを見つけることができないようです。何かご意見は?
Peter Bagnall、2015年

この場合、パッケージを検索する必要があります。DBA_DEPENDENCIES特定のオブジェクトがドロップされた場合に何が無効化されるかなどを表示します。たとえば、どのビューがテーブルを参照しているかを見つけることができます。
Mindaugas Riauba 2015年


0

私も同じような状況で、特定のパッケージを使用するパッケージのリストを取得する必要があるだけでした。だから私はこのクエリを作成しました、おそらくそれは役に立ちます:

with dep2 as (
    select dep.*
    from all_dependencies dep
    where dep.owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_owner not in ('SYS', 'SYSTEM', 'PUBLIC', 'XDB')
    and dep.referenced_type = 'PACKAGE'
    and dep.dependency_type != 'NON-EXISTENT'
    and (dep.referenced_owner || '.' || dep.referenced_name) != (dep.owner || '.' || dep.name)
),
dep3 as (
    select owner || '.' || name as child,
    referenced_owner || '.' || referenced_name as parent
    from dep2
)
select connect_by_root parent, lpad(' ',2*(level-1)) || to_char(child) 
from dep3
start with parent = 'SCHEMA.PACKAGE_NAME'
connect by nocycle prior child = parent 
and exists (select 1 from all_source where (owner || '.' || name) = dep3.child and upper(text) like upper('%optional, some string you may want to search%')) 
;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.