आपको कैसे पता चलेगा कि एक संग्रहीत प्रक्रिया का उपयोग किया जाता है (अन्य संग्रहीत प्रक्रियाओं में)


10

मेरे पास एक संग्रहीत कार्यविधि है जिसे मैं रिफैक्टर करना चाहता हूं, एक डेटाबेस में जिसमें हजारों एसपी हैं। क्या अन्य एसपी में उस संग्रहीत प्रक्रिया के संदर्भों को खोजने का एक त्वरित तरीका है ताकि मुझे यकीन हो सके कि मैं किसी अन्य कोड को नहीं तोड़ रहा हूं जब मैं रिफ्लेक्टर करता हूं।

एप्लिकेशन कोड में मैं एसपी को आसानी से कॉल करने के लिए पर्याप्त देख सकता हूं, और मैं उन सभी एसक्यूएल फाइलों पर एक पाठ खोज कर सकता हूं जो एसपी को परिभाषित करते हैं, लेकिन यह संभव है कि डेटाबेस में कुछ एसपी हो सकते हैं जो इस तरह से चूक सकते हैं ।

संपादित करें: मैं जिन प्रक्रियाओं का पता लगाने की कोशिश कर रहा हूं, वे पैकेज का हिस्सा हैं।

संपादित करें: मैं Oracle 11g पर चल रहा हूं

जवाबों:


11

DBA_DEPENDENCIES दृश्य में ऐसे सवालों के सभी जवाब हैं।

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

2
यदि आप गतिशील sql का उपयोग करते हैं तो यह दृष्टिकोण काम नहीं करेगा। यदि आप डायनामिक एसक्यूएल के हिस्से के रूप में एक प्रक्रिया निष्पादित करते हैं। अन्यथा dba_ या all_d dependencies बहुत अच्छा काम करेंगे।
राज

1
यह सहायक है, और मैं उन कार्यों और प्रक्रियाओं का पता लगा सकता हूं जो एक उपयोगकर्ता द्वारा परिभाषित किए गए हैं, लेकिन मुझे ऐसा प्रतीत नहीं होता है कि एफएनएस या एसपी पाए जा सकते हैं जो एक पैकेज में परिभाषित हैं। कोई विचार?
पीटर बैगनॉल

इस मामले में एक पैकेज की तलाश करनी होगी। DBA_DEPENDENCIESयदि विशेष वस्तु को छोड़ दिया जाता है तो हमें और अधिक अमान्य घोषित कर दिया जाएगा। तो उदाहरण के लिए आप क्या विचार तालिका देख सकते हैं।
मिंडुगास रियाउबा

6

यह काम करने के लिए प्रतीत होता है - यह @ MindaugasRiauba के उत्तर से कम सुरुचिपूर्ण है, लेकिन यह सभी पैकेजों से संदर्भ खोजने लगता है।

SELECT * FROM all_source
where UPPER(TEXT) like UPPER('%STORED_PROCEDURE_NAME%')

( आप कैसे बता सकते हैं कि पीएल / एसक्यूएल पैकेज, प्रक्रिया, या फ़ंक्शन का उपयोग किया जा रहा है? )


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%')) 
;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.