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
です とにかく。