2009-09-21 16 views
7

मान लीजिए कि मेरे पास स्कीमा A और B है।ओरेकल: तालिका और स्कीमा नाम के बीच असंबद्ध

स्कीमा A में मैं स्कीमा B में पैकेज X पर कॉल करना चाहता हूं। हालांकि, स्कीमा A में पैकेज B मौजूद है।

A: 
    package B 
B: 
    package X 

जब मैं स्कीमा एक से फोन:

begin b.x.foo(); end 

यह पैकेज B में प्रक्रिया X के लिए लग रहा है, अर्थात A.B.X(), और एक त्रुटि हो जाता है।

स्कीमा नाम माना जाने के लिए B को मजबूर करने के लिए कॉल को पूरी तरह से अर्हता प्राप्त कैसे कर सकता हूं?

अद्यतन:

  • यह कोई रास्ता नहीं संदर्भ b.x.foo का उल्लेख करने के लिए गुंजाइश नहीं है प्रतीत होता है।
  • CREATE SYNONYM B_X for B.X काम करता है। B_X.foo() स्कीमा बी में प्रक्रिया कॉल
+0

क्या आप बीएक्स में उस बिंदु में समानार्थी बना सकते हैं इसका एक स्पष्ट नाम है? हालांकि, यह आपको एक ही समस्या दे सकता है। – skaffman

उत्तर

7

मुझे नहीं लगता कि आप कर सकते हैं करते हैं। PL/SQL और SQL के लिए PL/SQL User's Guide:

"नाम संकल्प नियमों से समान हैं। अगर आप पर कब्जा परिहार नियमों का पालन करें। संगतता के लिए, एसक्यूएल नियम PL/SQL नियमों की तुलना में अधिक अनुमोदक हैं आप कुछ अंतर से बच सकते हैं । एसक्यूएल नियम, जो ज्यादातर संदर्भ संवेदनशील होते हैं, PL/SQL नियमों की तुलना में के रूप में कानूनी अधिक स्थितियों और DML बयान को पहचानते हैं।

  • PL/SQL एसक्यूएल के रूप में जब PL/SQL संकलक प्रक्रियाओं में एक ही नाम संकल्प नियमों का उपयोग करता है एक एसक्यूएल कथन, जैसे कि डीएमएल कथन। उदाहरण के लिए, एचआर.जेओबीएस जैसे नाम के लिए, एसक्यूएल पहले एचआर स्कीमा में वस्तुओं से मेल खाता है, फिर मौजूदा स्कीमा में संकुल, प्रकार, टेबल और विचार।
  • पीएल/एसक्यूएल पीएल/एसक्यूएल स्टेटमेंट जैसे नाम और प्रक्रिया कॉल में नाम हल करने के लिए एक अलग आदेश का उपयोग करता है। एक नाम HR.JOBS के मामले में, PL/SQL मानव संसाधन स्कीमा में वस्तुओं के लिए संकुल, प्रकार, तालिकाओं और विचारों वर्तमान स्कीमा में मानव संसाधन नामित के लिए पहले खोज करता है, तो। "

दूसरी गोली से ऊपर लागू होता है। चूंकि ऑब्जेक्ट "बी" स्कीमा ए में मौजूद है, इसलिए संदर्भ संदर्भित करता है।

3

मैं DCookie से सहमत हूं, यह एक सामान्य स्कोपिंग समस्या है। यदि आप इस स्थिति में हैं, तो हल करने का एक तरीका मुद्दा CURRENT_SCHEMA:

SQL> exec b.x.foo; 

begin b.x.foo; end; 

ORA-06550: line 2, column 9: 
PLS-00302: component 'X' must be declared 
ORA-06550: line 2, column 7: 
PL/SQL: Statement ignored 

SQL> alter session set current_schema=b; 

Session altered 

SQL> exec b.x.foo; 

PL/SQL procedure successfully completed 
+0

+1 अच्छा वर्कअराउंड – skaffman

+0

यह केवल तभी काम करता है जब आप पीएल/एसक्यूएल ब्लॉक चलाने से पहले वर्तमान स्कीमा सेट करते हैं, और इस प्रकार पूरे ब्लॉक के लिए प्रभावी है। आप पीएल/एसक्यूएल ब्लॉक के अंदर परिवर्तन सत्र नहीं चला सकते हैं। यदि यह कोई समस्या नहीं है, तो यह काम करता है। – DCookie

+0

@DCookie: यह केवल एक साधारण कामकाज है - सच्चा समाधान एक नामकरण योजना तैयार करना होगा जो इस प्रकार के नाम टकराव को रोकता है –

संबंधित मुद्दे