Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Kolekcja Oracle w klauzuli gdzie

Nie możesz użyć lokalnie zadeklarowanej kolekcji w klauzuli 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

Ale możesz, jeśli jest zadeklarowany na poziomie schematu, zasadniczo po to, aby SQL znał typ, a nie tylko 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.

Możesz także dołączyć do table konstruuj zamiast używać podzapytania:

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

Nie do końca rozumiem, co robisz. (Jeśli nie używasz kolekcji do niczego innego, lepiej po prostu dołączyć surowe dane, ale zakładam, że kolekcja jest tam z jakiegoś powodu).

Jak @haki wspomniał w komentarzach, możesz również zrobić:

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

... tak długo, jak i_name a porównywana kolumna jest taka sama wpisz . W moim przykładzie znajduje zero wierszy, ponieważ próbuję porównać nvarchar2 z varchar2 , ale znalazłby dopasowanie, gdyby przedefiniował i_name jako varchar2(512) . W twoim przypadku prawdopodobnie tab.col to nvarchar2 w każdym razie.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL do aktualizacji Pomiń zablokowane zapytanie i wielowątkowość Java — jak to naprawić

  2. Utwórz CLOB z długiego ciągu za pomocą JDBC

  3. Różnica między klauzulą ​​WITH a podzapytanie?

  4. Nie można znaleźć modułu Pythona cx_Oracle

  5. Wstawić do tabeli przy użyciu zestawu wyników podwójnego zapytania?