Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

ORA-22905 - जब किसी तालिका प्रकार को चयन कथन के साथ क्वेरी किया जाता है

पीएल/एसक्यूएल में टेबल प्रकारों को क्वेरी करना संभव है, लेकिन केवल नेस्टेड टेबल और वेरिए जिनके प्रकार स्कीमा-स्तर पर घोषित किए गए हैं, यानी पीएल/एसक्यूएल के बाहर।

त्रुटि

<ब्लॉककोट>

ORA-22905:गैर-नेस्टेड तालिका आइटम से पंक्तियों तक नहीं पहुंच सकता

इसका मतलब है कि आप एक असमर्थित तालिका प्रकार से क्वेरी करने का प्रयास कर रहे हैं। आपका प्रकार type_tab_AB INDEX BY BINARY_INTEGER के कारण एक सहयोगी सरणी है खंड। INDEX BY BINARY_INTEGER निकालें अपना type_tab_AB बनाने के लिए क्लॉज एक नेस्टेड तालिका प्रकार। (वैरे यहां भी काम करेंगे, लेकिन मैं उनका उपयोग करने की अनुशंसा नहीं करता जब तक कि आप अपेक्षित पंक्तियों की संख्या के लिए ऊपरी सीमा नहीं जानते। एक वेरे प्रकार की घोषणा करते समय, आपको तत्वों की अधिकतम संख्या निर्दिष्ट करने की आवश्यकता होती है, जबकि नेस्टेड तालिका प्रकारों में होता है ऐसा कोई प्रतिबंध नहीं।)

यह परिवर्तन करने के बाद, आपका कोड अभी भी काम नहीं कर सकता है। अगली त्रुटि जो आपको मिल सकती है (यदि नहीं है तो नीचे नोट देखें) है

<ब्लॉककोट>

PLS-00642:SQL स्टेटमेंट में स्थानीय संग्रह प्रकारों की अनुमति नहीं है

ऐसा इसलिए है क्योंकि आप जिस प्रकार का चयन कर रहे हैं वह पीएल/एसक्यूएल के अंदर घोषित किया गया है। आपको type_tab_AB . घोषित करने की आवश्यकता है , और record_AB PL/SQL के बाहर, CREATE TYPE ... . का उपयोग करके ।

आपके सामने आने वाली अगली समस्या कीवर्ड RECORD . के कारण होगी . रिकॉर्ड प्रकार केवल पीएल/एसक्यूएल के अंदर बनाए जा सकते हैं, उन्हें स्कीमा स्तर पर नहीं बनाया जा सकता है। बदलें RECORD करने के लिए OBJECT इसे ठीक करने के लिए।

आपके सामने आने वाली आखिरी समस्या है SELECT t.AA, t.BB BULK COLLECT INTO tab_AB FROM ... बयान। जैसा कि यह खड़ा है, यह क्वेरी आपको निम्न त्रुटि देगी:

<ब्लॉककोट>

PL/SQL:ORA-00947:काफ़ी मान नहीं हैं

आप प्रत्येक पंक्ति से दो आइटम का चयन कर रहे हैं और डेटा को बल्क-इंसर्ट करने के लिए केवल एक तालिका प्रदान कर रहे हैं। Oracle यह नहीं समझ पा रहा है कि आप अपने record_AB . में दो आइटम्स को स्टफ करना चाहते हैं प्रकार। आप क्वेरी को SELECT record_AB(t.AA, t.BB) BULK COLLECT INTO tab_AB FROM ... में बदलकर इसे काफी आसानी से ठीक कर सकते हैं। ।

सामूहिक रूप से इन परिवर्तनों से समस्या का समाधान होना चाहिए। यहां एक पूर्ण SQL*Plus स्क्रिप्ट है जो कुछ परीक्षण डेटा के साथ एक परीक्षण तालिका बनाती है और सत्यापित करती है कि यह तालिका प्रकार को क्वेरी कर सकती है:

CREATE TABLE some_table (AA VARCHAR2(16 BYTE), BB VARCHAR2(16 BYTE));

INSERT INTO some_table (AA, BB) VALUES ('aa 1', 'bb 1');
INSERT INTO some_table (AA, BB) VALUES ('aaaaaaaaaa 2', 'b 2');
INSERT INTO some_table (AA, BB) VALUES ('aaaaa 3', 'bbbbbbbbbbbbbb 3');
COMMIT;

VARIABLE curs REFCURSOR;

CREATE OR REPLACE TYPE record_AB AS OBJECT
   (
      AA    VARCHAR2 (16 BYTE),
      BB    VARCHAR2 (16 BYTE)
   );
/

CREATE OR REPLACE TYPE type_tab_AB IS TABLE OF record_AB;
/

DECLARE
  tab_AB   type_tab_AB;
BEGIN
  SELECT record_AB(t.AA, t.BB)
    BULK COLLECT INTO tab_AB 
    FROM some_table t;

  OPEN :curs FOR SELECT * FROM TABLE (tab_AB) ;
END;
/

PRINT :curs

मैंने SELECT . का परिणाम दिया है tab_AB . की सामग्री में एक कर्सर में, और इसकी सामग्री को सूचीबद्ध करने के लिए SQL*Plus कर्सर चर का उपयोग किया। जब मैं Oracle 11g XE पर स्क्रिप्ट चलाता हूं, तो सभी 'टाइप क्रिएटेड' और 'PL/SQL प्रक्रिया सफलतापूर्वक पूर्ण' संदेशों के बाद मुझे जो आउटपुट मिलता है, वह इस प्रकार है:

AA               BB
---------------- ----------------
aa 1             bb 1
aaaaaaaaaa 2     b 2
aaaaa 3          bbbbbbbbbbbbbb 3

नोट: सादगी के लिए, मैंने माना है कि प्रश्नकर्ता Oracle 11 या पुराने का उपयोग कर रहा है। Oracle 12 में, मेरा मानना ​​है कि आपको SQL क्वेरी में PL/SQL में घोषित प्रकारों का उपयोग करने की अनुमति है, इसलिए आपको PLS-00642 त्रुटि का सामना नहीं करना पड़ सकता है। मैं यह नहीं कह सकता कि मेरे उत्तर में अन्य परिवर्तन Oracle 12 के लिए भी आवश्यक हो सकते हैं क्योंकि मैंने अभी तक Oracle 12 का उपयोग नहीं किया है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle PLSQL टेबल्स (एसोसिएटिव एरे या इंडेक्स-बाय टेबल) का उपयोग कैसे करें

  2. Oracle में गैर-कामकाजी घंटों को कैसे समाप्त करें

  3. Oracle में एक साथ कई स्ट्रिंग्स को कैसे बदलें?

  4. लापता संग्रह लॉग से स्टैंडबाय डेटाबेस को कैसे पुनर्प्राप्त करें

  5. कार्य सूची