我宣布一个类型TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
,然后我初始化:MY_array arr_type := arr_type();
。
我在其中插入了一些 varchars,然后尝试将它与 IN 运算符一起使用。
set serveroutput on;
DECLARE
TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
my_array arr_type := arr_type();
my_array_two arr_type := arr_type();
BEGIN
SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;
FOR i IN 1..cm_array.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(my_array(i));
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)
我收到错误:local collection types not allowed in SQL statements
在包含:的行上SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST WHERE PARENT_ID IN my_array;
,但这没有意义,因为如果我注释掉该行,则my_array
打印正常,这意味着TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
.
我怀疑这个问题是因为我试图将无界数组与 IN 运算符 ie 一起使用PARENT_ID IN my_array
。
我尝试将变量包装在括号内,但没有帮助。如何在数组中使用 IN 运算符?
我知道在这种情况下我可以使用子查询或连接,但我想知道是否可以使用带有 IN 运算符的数组。
Bal*_*app 10
WHERE PARENT_ID IN my_array;
Run Code Online (Sandbox Code Playgroud)
这是行不通的。首先,如错误消息所述,您不允许在 SQL 语句中使用本地集合类型,您需要在数据库中定义它们。其次,该语法不存在。
所以首先你定义类型:
CREATE TYPE arr_type is TABLE of VARCHAR2(11 BYTE);
Run Code Online (Sandbox Code Playgroud)
之后,您可以使用具有以下TABLE()
功能的集合:
set serveroutput on;
DECLARE
my_array arr_type := arr_type();
my_array_two arr_type := arr_type();
BEGIN
SELECT MY_ID BULK COLLECT INTO my_array FROM XYZ_REQUEST;
SELECT ANOTHER_ID BULK COLLECT INTO my_array_TWO FROM ABC_REQUEST
WHERE PARENT_ID IN (select * from table(my_array)); -- <==========================
FOR i IN 1..cm_array.COUNT LOOP
DBMS_OUTPUT.PUT_LINE(my_array(i));
END LOOP;
END;
/
Run Code Online (Sandbox Code Playgroud)