2011-07-12 8 views
19

जब मेरे पास select * from table1 जैसे एसक्यूएल स्टेटमेंट है, तो यह बहुत अच्छा काम करता है, लेकिन जैसे ही मैं इसे डालता हूं एक समारोह, मुझे मिलता है:ओआरए -00 9 42: तालिका या दृश्य मौजूद नहीं है (एक अलग एसक्यूएल के रूप में काम करता है, लेकिन एक ऑरैक फ़ंक्शन के अंदर काम नहीं करता है)

ORA-00942: table or view does not exist 

इसे कैसे हल करें?

+0

शायद फ़ंक्शन तालिका से भिन्न स्कीमा से संबंधित है? –

+0

दृढ़ता से संबंधित: [ओरेकल के अंदर संग्रहित प्रक्रिया से "तालिका या दृश्य मौजूद नहीं है"] (http://stackoverflow.com/q/4198052/1377865) –

उत्तर

14

कुछ ऐसी चीजें हैं जिन्हें आप देख सकते हैं। आपके प्रश्न के आधार पर, ऐसा लगता है कि फ़ंक्शन स्वामी टेबल स्वामी से अलग है।

1) एक भूमिका के माध्यम से अनुदान: किसी अन्य उपयोगकर्ता की वस्तुओं पर संग्रहित प्रक्रियाओं और कार्यों को बनाने के लिए, आपको वस्तुओं (प्रत्यक्ष भूमिका के माध्यम से पहुंचने के बजाय) तक सीधे पहुंच की आवश्यकता होती है।

2)

डिफ़ॉल्ट रूप से, संग्रहित प्रक्रियाओं और SQL तरीकों अपने मालिक, न कि उनका वर्तमान उपयोगकर्ता के विशेषाधिकारों के साथ निष्पादित।

आप स्कीमा एक में एक मेज और स्कीमा बी में समारोह बनाई गई हैं, तो आप Oracle की Invoker/Definer अधिकार अवधारणाओं पर एक नज़र डालें समझने के लिए क्या कारण समस्या हो सकती चाहिए।

http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/subprograms.htm#LNPLS00809

3

सुनिश्चित करें कि फ़ंक्शन तालिका के समान डीबी स्कीमा में है।

+0

समारोह एक पैकेज के अंदर है, तो पैकेज भी के हैं की जरूरत है टेबल के समान स्कीमा? – Victor

+0

हां, यह करता है। अन्यथा, यह तालिका नहीं ढूंढ पाएगा। जब तक आप चयन में स्कीमा नाम शामिल नहीं करते: 'schema.table1' –

31

वहाँ एक मजबूत संभावना है कि विशेषाधिकार table1 से चयन करने के लिए एक भूमिका के लिए प्रदान किया गया है, और भूमिका आप के लिए दी गई है। भूमिका के लिए दिए गए विशेषाधिकार किसी उपयोगकर्ता द्वारा लिखे गए पीएल/एसक्यूएल के लिए उपलब्ध नहीं हैं, भले ही उपयोगकर्ता को भूमिका निभाई गई हो।

आप इसे उन उपयोगकर्ताओं के लिए बहुत कुछ देखते हैं जिन्हें sys के स्वामित्व वाली वस्तुओं पर डीबीए भूमिका दी गई है। डीबीए भूमिका वाला उपयोगकर्ता SELECT * from V$SESSION कह सकता है, लेकिन SELECT * FROM V$SESSION में कोई फ़ंक्शन लिखने में सक्षम नहीं होगा।

ठीक स्पष्ट अनुमतियां उपयोगकर्ता के लिए प्रश्न में वस्तु पर सीधे उदाहरण के लिए, ऊपर SYS उपयोगकर्ता है प्रदान करने के लिए, इस मामले में, है करने के लिए GRANT SELECT ON V_$SESSION TO MyUser;

+0

से कॉलम का चयन करें, क्या आप इस तकनीक का उपयोग कर एक पूर्ण प्रक्रिया उदाहरण के साथ इस उत्तर को अपडेट करने में सक्षम होंगे? – user3554664

+0

दुर्भाग्यवश, मैं नौकरी पर काम नहीं कर रहा हूं जो अब ओरेकल का उपयोग करता है, इसलिए मेरे पास लिखने वाले किसी वाक्यविन्यास की वैधता का परीक्षण करने के लिए मशीन नहीं है। अगर कोई और उस पर एक स्टैब लेना चाहता है, हालांकि, मेरा अतिथि बनें। –

1

या तो यू न कि स्कीमा/तालिका करने की अनुमति या टेबल मौजूद है। अधिकतर यह समस्या तब हुई जब आप अपनी संग्रहीत प्रक्रियाओं में अन्य स्कीमा टेबल का उपयोग कर रहे हैं। ईजी। यदि आप उपयोगकर्ता/स्कीमा एबीसी से संग्रहीत प्रक्रिया चला रहे हैं और उसी पीएल/एसक्यूएल में ऐसे टेबल हैं जो उपयोगकर्ता/स्कीमा XYZ से हैं। इस मामले में एबीसी को XYZ टेबल

एबीसी को अनुदान देना चाहिए;

Select * From Dba_Tab_Privs Where Owner = 'XYZ'and Table_Name = <Table_Name>; 
0

एक बहुत ही सरल समाधान यदि आपके डीबी नाम DBMS है और मेज info तो यह किसी भी प्रश्न के लिए DBMS.info हो जाएगा की तरह अपने तालिका नाम के साथ डेटाबेस नाम जोड़ने के लिए है।

अगर आपकी क्वेरी

select * from STUDENTREC where ROLL_NO=1; 

है यह एक त्रुटि लेकिन

select * from DBMS.STUDENTREC where ROLL_NO=1; 

यह नहीं है क्योंकि अब वास्तव में अपनी मेज पाया जाता है दिखा सकते हैं।