Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Koleksi Oracle di mana klausa

Anda tidak dapat menggunakan koleksi yang dideklarasikan secara lokal dalam klausa 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

Tetapi Anda dapat melakukannya jika dideklarasikan pada level skema, pada dasarnya agar SQL mengetahui tipenya, bukan hanya PL/SQL:

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.

Anda juga dapat bergabung dengan table membangun daripada menggunakan subquery:

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

Saya tidak cukup jelas apa yang Anda dong sekalipun. (Jika Anda tidak menggunakan koleksi untuk hal lain, sebaiknya gabungkan saja dengan data mentah, tetapi saya berasumsi bahwa koleksi ada karena suatu alasan).

Seperti yang disebutkan @haki dalam komentar, Anda juga dapat melakukan:

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

... selama i_name dan kolom yang Anda bandingkan dengan adalah sama ketik . Dalam contoh saya, ia menemukan nol baris karena saya mencoba membandingkan nvarchar2 dengan varchar2 , tetapi akan menemukan kecocokan jika didefinisikan ulang i_name sebagai varchar2(512) . Dalam kasus Anda mungkin tab.col adalah nvarchar2 bagaimanapun juga.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Masalah penasaran dengan Oracle UNION dan ORDER BY

  2. gunakan LIKE dan IN dengan subquery di sql

  3. Prosedur PL/SQL:Bagaimana mengembalikan pernyataan pilih?

  4. Paksa sensitivitas kasus pengidentifikasi di Oracle

  5. Membandingkan daftar nilai dengan tabel