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

Oracle संग्रह जहां खंड

आप SQL खंड में स्थानीय रूप से घोषित संग्रह का उपयोग नहीं कर सकते:

declare
    type i_name is table of nvarchar2(512);
    i_itemname i_name := i_name();
    c number;
begin
    select distinct owner bulk collect into i_itemname from all_objects;
    dbms_output.put_line(i_itemname.count);
    select count(*) into c
    from all_tables
    where owner in (select * from table(i_itemname));
    dbms_output.put_line(c);
end;
/

    where owner in (select * from table(i_itemname));
                                        *
ERROR at line 10:
ORA-06550: line 10, column 41:
PLS-00642: local collection types not allowed in SQL statements
ORA-06550: line 10, column 35:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 8, column 5:
PL/SQL: SQL Statement ignored

लेकिन आप इसे स्कीमा स्तर पर घोषित कर सकते हैं, अनिवार्य रूप से ताकि एसक्यूएल प्रकार के बारे में जानता हो, न कि केवल पीएल/एसक्यूएल:

create type i_name is table of nvarchar2(512);
/

Type created.

declare
    i_itemname i_name := i_name();      
    c number;
begin 
    select distinct owner bulk collect into i_itemname from all_objects;
    dbms_output.put_line(i_itemname.count);
    select count(*) into c from all_tables
    where owner in (select * from table(i_itemname));
    dbms_output.put_line(c);
end;
/

No errors.
18
128

PL/SQL procedure successfully completed.

आप table में भी शामिल हो सकते हैं सबक्वेरी का उपयोग करने के बजाय निर्माण करें:

...
    select count(*) into c
    from table(i_itemname) t
    join all_tables at on at.owner = t.column_value;
...

हालांकि मैं बिल्कुल स्पष्ट नहीं हूं कि आप क्या कर रहे हैं। (यदि आप किसी अन्य चीज़ के लिए संग्रह का उपयोग नहीं कर रहे हैं, तो बेहतर होगा कि आप केवल कच्चे डेटा में शामिल हों, लेकिन मुझे लगता है कि संग्रह एक कारण से है)।

जैसा कि @haki ने टिप्पणियों में उल्लेख किया है, आप यह भी कर सकते हैं:

...
    select count(*) into c
    from all_tables
    where owner member of (i_itemname);
...

... जब तक i_name और जिस कॉलम की आप तुलना कर रहे हैं एक ही हैं टाइप करें . मेरे उदाहरण में इसे शून्य पंक्तियाँ मिलती हैं क्योंकि मैं तुलना करने की कोशिश कर रहा हूँ nvarchar2 varchar2 . के साथ , लेकिन i_name . को फिर से परिभाषित करने पर एक मिलान मिलेगा varchar2(512) . के रूप में . आपके मामले में संभवतः tab.col nvarchar2 है वैसे भी।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. काम करने के लिए विश्लेषणात्मक कार्य के लिए बाद के एपी के लिए गतिशील रूप से शून्य-मूल्यवान रिकॉर्ड जोड़ना

  2. किसी अन्य तालिका में सम्मिलित करने के लिए ट्रिगर बनाएं

  3. Oracle में स्तंभ मानों की अदला-बदली

  4. Oracle के साथ काम करते समय Fluent NHibernate के साथ बैच लाने को कैसे कार्यान्वित करें?

  5. Oracle TO_DATE काम नहीं कर रहा