何千ものSPを持つデータベースに、リファクタリングしたいストアドプロシージャがあります。他のSPでそのストアドプロシージャへの参照をすばやく見つける方法はありますか?そうすれば、リファクタリングするときに他のコードを壊していないことを確認できます。
アプリケーションコードでは、SPへの呼び出しを簡単に検索できます。また、SPを定義するさまざまなSQLファイルすべてに対してテキスト検索を実行できますが、一部のSPが存在する可能性がありますそのように見逃される可能性があるデータベースで。
編集:私が見つけようとしているストアドプロシージャは、パッケージの一部です。
編集:私はOracle 11gで実行しています
DBA_DEPENDENCIES
ビューには、このような質問に対するすべての回答があります。
select * from DBA_DEPENDENCIES
where referenced_owner='HR' and referenced_name='STORED_PROCEDURE_41';
これは機能しているようです-@MindaugasRiaubaの回答よりエレガントではありませんが、すべてのパッケージからの参照を見つけているようです。
SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%STORED_PROCEDURE_NAME%')
同様の状況で、特定のパッケージを使用するパッケージのリストを取得する必要があるだけでした。だから私はこのクエリを作成しました、おそらくそれは役に立ちます:
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%'))
;