निजी कार्यों की प्रकृति यह है कि वे निजी होते हैं। कोई डेटा डिक्शनरी दृश्य नहीं हैं जो उन्हें डिफ़ॉल्ट रूप से उजागर करते हैं। USER_PROCEDURES और USER_ARGUMENTS केवल सार्वजनिक प्रक्रियाओं के लिए जानकारी दिखाते हैं (वे जो एक पैकेज spec0 में परिभाषित हैं।
हालाँकि, हम PL/SCOPE का उपयोग करके उनके बारे में जानकारी प्राप्त कर सकते हैं, लेकिन ऐसा करने के लिए थोड़े अतिरिक्त प्रयास की आवश्यकता होती है:
SQL> alter session set plscope_settings='IDENTIFIERS:ALL';
SQL> alter package your_package compile body;
अब आप इस क्वेरी के साथ अपनी निजी कार्यक्रम इकाइयाँ पा सकते हैं:
select ui.type, ui.name, ui.usage_id
from user_identifiers ui
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DEFINITION'
and ui.type in ('PROCEDURE', 'FUNCTION')
minus
( select 'PROCEDURE', upr.procedure_name
from user_procedures upr
where upr.object_name = 'YOUR_PACKAGE'
union
select 'FUNCTION', uarg.object_name
from user_arguments uarg
where uarg.package_name = 'YOUR_PACKAGE'
and uarg.position = 0
);
निजी प्रक्रिया के तर्क प्राप्त करने के लिए पिछली क्वेरी से USAGE_ID को इस क्वेरी में प्लग करें:
select ui.name
, ui.type
, ui.usage_id
, ui2.type as param_datatype
from user_identifiers ui
left join user_identifiers ui2
on ui2.usage_context_id = ui.usage_id
where ui.object_name = 'YOUR_PACKAGE'
and ui.usage = 'DECLARATION'
and ui.usage_context_id = :private_proc_usage_id
/
इसे लेफ्ट जॉइन करने की आवश्यकता है क्योंकि user_identifiers
स्केलर डेटाटाइप (चरित्र, संख्या, दिनांक, क्लोब) के लिए डेटाटाइप प्रविष्टियां हैं, लेकिन जटिल डेटाटाइप (xmltype, उपयोगकर्ता-परिभाषित प्रकार) नहीं हैं।
हम PL/SCOPE से प्रक्रियाओं के बारे में बहुत सारी जानकारी प्राप्त कर सकते हैं, भले ही यह USER_PROCEDURES या USER_ARGUMENTS को क्वेरी करने जितना आसान नहीं है (वास्तव में, यह आश्चर्यजनक रूप से भद्दा है)। और अधिक जानकारी प्राप्त करें। सावधान रहें कि PL/SCOPE डेटा SYSAUX टेबलस्पेस पर संग्रहीत है, इसलिए अपने DBA के साथ गर्म पानी में न जाएं!