Làm thế nào để bạn tìm thấy nơi một thủ tục được lưu trữ được sử dụng (trong các thủ tục được lưu trữ khác)


10

Tôi có một thủ tục được lưu trữ mà tôi muốn cấu trúc lại, trong cơ sở dữ liệu có hàng ngàn SP. Có cách nào nhanh chóng để tìm các tham chiếu đến quy trình được lưu trữ trong các SP khác để tôi có thể chắc chắn rằng tôi không vi phạm bất kỳ mã nào khác khi tôi cấu trúc lại.

Trong mã ứng dụng, tôi có thể tìm kiếm các cuộc gọi đến SP đủ dễ dàng và tôi có thể thực hiện tìm kiếm văn bản trên tất cả các tệp sql khác nhau xác định SP, nhưng có thể có một số SP trong cơ sở dữ liệu có thể bị bỏ lỡ theo cách đó .

EDIT: Các thủ tục được lưu trữ mà tôi đang cố gắng xác định là một phần của gói.

EDIT: Tôi đang chạy trên Oracle 11g

Câu trả lời:


11

DBA_DEPENDENCIES xem có tất cả các câu trả lời cho các câu hỏi như vậy.

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

2
Cách tiếp cận này tuy nhiên sẽ không hiệu quả nếu bạn sử dụng sql động. tức là nếu bạn thực hiện một thủ tục như là một phần của sql động. Nếu không, dba_ hoặc all_dependencies sẽ hoạt động tốt.
Raj

1
Điều này rất hữu ích và tôi có thể định vị các chức năng và quy trình do người dùng xác định, nhưng dường như tôi không thể tìm thấy FN hoặc SP được xác định trong một gói. Có suy nghĩ gì không?
Peter Bagnall

Trong trường hợp này người ta phải tìm kiếm một gói. DBA_DEPENDENCIEShiển thị cho chúng tôi nhiều hơn những gì sẽ bị vô hiệu nếu đối tượng cụ thể được thả. Vì vậy, ví dụ bạn có thể tìm thấy những gì xem bảng tham khảo.
Mindaugas Riauba


0

Tôi đã có một tình huống tương tự, chỉ là tôi cần lấy một danh sách các gói sử dụng một gói cụ thể; Vì vậy, tôi đã thực hiện truy vấn này, có thể nó giúp:

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%')) 
;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.