sql >> Databasteknik >  >> RDS >> Oracle

Oracle-samling i where-klausul

Du kan inte använda en lokalt deklarerad samling i en SQL-sats:

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 du kan om det deklareras på schemanivå, huvudsakligen så att SQL känner till typen, inte bara 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 också gå med i table konstruera istället för att använda en underfråga:

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

Jag är inte helt klar över vad du menar. (Om du inte använder samlingen till något annat är det bättre att du bara går med i rådata, men jag antar att samlingen finns där av en anledning).

Som @haki nämnde i kommentarerna kan du också göra:

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

... så länge som i_name och kolumnen du jämför med är densamma typ . I mitt exempel hittar den noll rader eftersom jag försöker jämföra nvarchar2 med varchar2 , men skulle hitta en matchning om i_name omdefinierades som varchar2(512) . I ditt fall förmodligen tab.col är nvarchar2 i alla fall.




  1. Hur ändrar man en kolumn och ändrar standardvärdet?

  2. Vad betyder %Type i Oracle sql?

  3. Dynamiska tabell-/entitetsnamn i Doktrin 2

  4. hur skapar jag en filuppladdning i grails som fungerar med Oracle?