저장 프로 시저가 사용되는 위치를 찾는 방법 (다른 저장 프로 시저에서)


10

수천 개의 SP가있는 데이터베이스에 리팩토링하려는 저장 프로 시저가 있습니다. 다른 SP에서 해당 저장 프로 시저에 대한 참조를 찾는 빠른 방법이 있으므로 리팩터링 할 때 다른 코드를 중단하지 않을 수 있습니다.

응용 프로그램 코드에서 SP에 대한 호출을 쉽게 찾을 수 있으며 SP를 정의하는 모든 다양한 SQL 파일에서 텍스트 검색을 수행 할 수 있지만 데이터베이스에 일부 SP가있을 수 있습니다. .

편집 : 찾으려고하는 저장 프로 시저는 패키지의 일부입니다.

편집 : Oracle 11g에서 실행 중입니다.

답변:


11

DBA_DEPENDENCIES view는 그러한 질문에 대한 모든 답을 가지고 있습니다.

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

2
그러나 동적 SQL을 사용하는 경우에는이 방법이 작동하지 않습니다. 즉, 동적 SQL의 일부로 프로 시저를 실행하는 경우입니다. 그렇지 않으면 dba_ 또는 all_dependencies가 훌륭하게 작동합니다.
Raj

1
이것은 도움이되며 사용자가 정의한 기능과 절차를 찾을 수 있지만 패키지에 정의 된 FN 또는 SP를 찾을 수없는 것 같습니다. 이견있는 사람?
피터 Bagnall

이 경우 패키지를 검색해야합니다. DBA_DEPENDENCIES특정 객체가 드롭되면 무효화되는 것과 같은 것을 더 보여줍니다. 예를 들어 테이블을 참조하는 뷰를 찾을 수 있습니다.
Mindaugas Riauba


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.