Oracle集合中的where子句

时间:2013-04-24 06:53:51

标签: oracle collections

我在oracle代码块中使用集合,因为没有表变量(就像在MS SQL Server中一样)。

DECLARE
    TYPE I_NAME IS TABLE OF NVARCHAR2(512);     
    I_ITEMNAME      I_NAME := I_NAME(); 
BEGIN 

我正在使用“BULK COLLECT INTO I_ITEMNAME”来填充收藏品。
我想在SELECT查询的WHERE子句中使用此集合,但无法找到执行此操作的方法。目前我正在使用FOR循环并逐个获取项目 我如何直接在WHERE子句中使用集合,如

  

SELECT * FROM TBL WHERE COL IN I_ITEMNAME?

谢谢,

1 个答案:

答案 0 :(得分:12)

您不能在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和您与are the same type进行比较的列。在我的示例中,它找到零行,因为我正在尝试将nvarchar2varchar2进行比较,但如果将i_name重新定义为varchar2(512),则会找到匹配项。在您的情况下,大概tab.col仍为nvarchar2

相关问题