2009-06-23 26 views
6

के भीतर से एक पीएल/एसक्यूएल फ़ंक्शन की स्कीमा कैसे निर्धारित करें मेरे पास ओरेकल 10 जी डेटाबेस में एक पीएल/एसक्यूएल पैकेज है और मैं एक ऐसा फ़ंक्शन लिखना चाहता हूं जो पैकेज के स्कीमा का नाम लौटाता है (और इसलिए फ़ंक्शन) में परिभाषित किया गया है। किसी को भी यह कैसे करना है?फ़ंक्शन

उत्तर

7
create function xcurr return varchar2 is 
    v_curr varchar2(32); 
begin 
    SELECT SYS_CONTEXT ('USERENV', 'CURRENT_USER') into v_curr from dual; 
    return v_curr; 
end; 

यह तब तक काम करेगा जब तक पीएल/एसक्यूएल ऑब्जेक्ट में AUTHID CURRENT_USER नहीं है।

+0

वाह। मैं इसके बारे में जानता था, लेकिन उम्मीद है कि यह वर्तमान उपयोगकर्ता को वापस करने की उम्मीद है, न कि उस उपयोगकर्ता को जिस पर फ़ंक्शन चल रहा था। धन्यवाद! –

1

शायद एक आसान तरीका है लेकिन आप dbms_utility.format_call_stack का उपयोग कर सकते हैं और स्कीमा नाम प्राप्त करने के लिए परिणामों का विश्लेषण कर सकते हैं। यह ओरेकल 9i में काम करता है।

+0

ओरेकल 11 त्रुटि संदेश में उपयोगकर्ता को नहीं दिखाता है। – Victor

6

ओरेकल 10 जी CURRENT_USER से, जैसा कि Gary Myers' answer में उपयोग किया गया है, को बहिष्कृत किया गया है। ओरेकल अनुशंसा करता है कि आप इसके बजाय SESSION_USER पैरामीटर का उपयोग करें, जो:

उद्यम उपयोगकर्ताओं के लिए, स्कीमा लौटाता है। अन्य उपयोगकर्ताओं के लिए, डेटाबेस उपयोगकर्ता नाम देता है जिसके द्वारा वर्तमान उपयोगकर्ता प्रमाणीकृत है। यह मान सत्र की अवधि के दौरान समान रहता है।

मैं CURRENT_SCHEMA का उपयोग करूंगा। ALTER SESSION SET CURRENT_SCHEMA कथन जारी होने पर CURRENT_SCHEMA परिवर्तनों के रूप में दोनों के बीच सूक्ष्म मतभेद हैं।

दोहरी से चयन करने की कोई आवश्यकता नहीं है; आप सीधे चर के लिए SYS_CONTEXT का वापसी मान असाइन कर सकते हैं।

DECLARE 
    v_current_schema varchar2(30); 
BEGIN 
    v_current_schema := SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA'); 
    dbms_output.put_line('I am using the schema [' || v_current_schema || ']'); 
END; 
+0

यह बहुत अलग नहीं है, लेकिन कुछ अलग कारण हैं जिन्हें मुझे अन्य उत्तर पसंद नहीं है। 1. आपको दोहरी से एक चर में चयन करने की आवश्यकता नहीं है, बस इसे असाइन करें। 2. CURRENT_USER [बहिष्कृत] है (http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions165.htm)। 3. CURRENT_SCHEMA और SESSION_USER के बीच मामूली अभी तक भिन्न अंतर हैं। –

+0

पर्याप्त मेला @ टॉम। मुझे पता नहीं था। मैंने यह सब जवाब देने के लिए अपना उत्तर अपडेट कर दिया है। कृपया एक नज़र डालें और देखें कि क्या कुछ भी आप बदलना चाहते हैं। – Ben