sql >> Database teknologi >  >> RDS >> Oracle

Oracle-samling i where-klausul

Du kan ikke bruge en lokalt erklæret samling i en SQL-sætning:

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

Men det kan du, hvis det er erklæret på skemaniveau, i det væsentlige så SQL kender til typen, ikke kun 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.

Du kan også deltage i table konstruer i stedet for at bruge en underforespørgsel:

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

Jeg er dog ikke helt klar over, hvad du er dong. (Hvis du ikke bruger samlingen til noget andet, ville du være bedre stillet blot at slutte dig til de rå data, men jeg går ud fra, at samlingen er der af en grund).

Som @haki nævnte i kommentarerne, kan du også gøre:

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

... så længe i_name og kolonnen, du sammenligner med er den samme type . I mit eksempel finder den nul rækker, fordi jeg forsøger at sammenligne nvarchar2 med varchar2 , men ville finde et match, hvis i_name blev omdefineret som varchar2(512) . I dit tilfælde formentlig tab.col er nvarchar2 alligevel.




  1. Integriteten af ​​linkede dataenheder ved opdatering

  2. Sådan opdaterer jeg med jævne mellemrum min lokale DB med ændringer fra produktions DB

  3. Oracle:Hvorfor jeg ikke kan stole på ROWNUM i en sletteklausul

  4. Strategi til at kortlægge flere filer i en enkelt tabel til et enkelt felt i en anden tabel