12c में, वर्तमान उपप्रोग्राम नाम बस है:
utl_call_stack.subprogram(1)(2);
वर्तमान पैकेज यहां से भी प्राप्त किया जा सकता है
utl_call_stack.subprogram(1)(1);
लेकिन आमतौर पर केवल $$plsql_unit
. का उपयोग करना आसान होता है . आप योग्य नाम भी प्राप्त कर सकते हैं (package.procedure
) के रूप में:
utl_call_stack.concatenate_subprogram(utl_call_stack.subprogram(1));
हालांकि , मैं ऐसी किसी भी स्थिति के बारे में नहीं सोच सकता जहां कोई प्रक्रिया या कार्य (या ऑब्जेक्ट विधि) अपना नाम चाहेगा। यह कार्यक्षमता ज्यादातर लॉगिंग प्रक्रिया में उपयोगी होती है, जिस स्थिति में 'मुझे किसने बुलाया?' कोड लॉगर में होना चाहिए, और इसे कॉल करने वाली प्रत्येक चीज़ में दोहराया नहीं जाना चाहिए। इसलिए, मैं दृढ़ता से सुझाव दूंगा कि 'मैं कौन हूं?' प्रक्रियाओं में तर्क। इसके बजाय, अपने लकड़हारे में कुछ इस तरह डालें (12.1 या बाद के संस्करण की आवश्यकता है):
create or replace procedure logdemo
as
k_calling_package constant varchar2(128) := utl_call_stack.subprogram(2)(1);
k_calling_subprog constant varchar2(128) := utl_call_stack.subprogram(2)(2);
begin
dbms_output.put_line
( $$plsql_unit ||
' called from package '||k_calling_package||', subprogram '||k_calling_subprog );
end logdemo;
दुर्भाग्य से यह 11g में थोड़ा अधिक जटिल है क्योंकि आपको dbms_utility.format_call_stack
को पार्स करना होगा। , और चूंकि यह आपको केवल पैकेज का नाम और लाइन नंबर देता है (लाइनफीड-सीमांकित टेक्स्ट स्ट्रिंग में), फिर आपको all_source
से पूछताछ करनी होगी उपप्रोग्राम नाम खोजने के लिए।
मैं कुछ 11g कोड पोस्ट कर सकता हूं यदि आप स्पष्ट करते हैं कि यह किस लिए है। अपने 11g लकड़हारे में मैंने dbms_utility.format_error_backtrace
को कैप्चर करना उपयोगी पाया साथ ही dbms_utility.format_call_stack
sqlcode
. के आधार पर आदि, इसलिए तर्क का एक समूह है जो लॉगिंग के लिए विशिष्ट है, जिसकी आपको आवश्यकता नहीं हो सकती है यदि आप किसी अन्य कारण से वर्तमान प्रक्रिया नाम को कैप्चर करना चाहते हैं।