Oracle
 sql >> база данни >  >> RDS >> Oracle

Колекция на Oracle в клауза where

Не можете да използвате локално декларирана колекция в 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

Но можете, ако е деклариран на ниво схема, по същество, така че SQL да знае за типа, а не само 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.

Можете също да се присъедините към 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. Оптимален начин за ИЗТРИВАНЕ на определени редове от Oracle

  2. DBCA Създаване на база данни е лошо REMOTE_LISTENER

  3. java - преминаващ масив в съхранената процедура на Oracle

  4. SQL Dynamic ASC и DESC

  5. Oracle тригери - проблем с мутиращи таблици