我想将表OS_CW.CW_FELDDATEN属性的PRIMITIVUMNUMMER(非空数字(38))与本地数组v_list_pNummber
中的值进行比较。这就是我到目前为止所做的:
DECLARE
TYPE array_of_numbers IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
v_list_parentID array_of_numbers;
v_list_pNummer array_of_numbers;
BEGIN
SELECT DBUID BULK COLLECT INTO v_list_parentID
FROM OS_SYS.V_CATALOG
WHERE PARENTID = 1;
SELECT PRIMITIVUMNUMMER BULK COLLECT INTO v_list_pNummer
FROM OS_CW.CW_FELDDATEN
WHERE KATALOG IN (v_list_parentID);
END;
运行上面的代码时出现此错误:
错误报告 -
ORA-06550:第28行,第104栏:
PLS-00382:表达式类型错误 06550. 00000 - "行%s,列%s:\ n%s"
*原因:通常是PL / SQL编译错误 *行动:
如何将列(数字)与表格NUMBER INDEX BY BINARY_INTEGER进行比较?
谢谢!
答案 0 :(得分:2)
SQL不能使用在本地PL / SQL范围内声明的类型。您需要在SQL (*):
中定义它SQL> create TYPE array_of_numbers IS TABLE OF NUMBER ;
2 /
Type created.
SQL>
然后使用TABLE()运算符将第一个集合转换为可以使用IN运算符引用的子查询:
SQL> set serveroutput on
SQL> declare
2 v_list_parentID array_of_numbers;
3 v_list_pNummer array_of_numbers;
4 begin
5 select dbuid bulk collect into v_list_parentID
6 from v_catalog
7 where parentid = 1;
8 dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
9
10 select primitivumnummer bulk collect into v_list_pNummer
11 from cw_felddaten
12 where katalog in (select * from table( v_list_parentID));
13
14 dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
15 end;
16 /
v_list_parentID count = 4
v_list_pNummer count = 24
PL/SQL procedure successfully completed.
SQL>
MEMBER OF语法也有效。它的输入较少,但如果CW_FELDDATEN有很多行,则可能无法像TABLE()运算符那样运行。
SQL> declare
2 v_list_parentID array_of_numbers;
3 v_list_pNummer array_of_numbers;
4 begin
5 select dbuid bulk collect into v_list_parentID
6 from v_catalog
7 where parent_id = 1;
8 dbms_output.put_line('v_list_parentID count = ' || v_list_parentID.count());
9
10 select primitivumnummer bulk collect into v_list_pnummer
11 from cw_felddaten
12 where katalog member of v_list_parentID;
13
14 dbms_output.put_line('v_list_pNummer count = ' || v_list_pNummer.count());
15 end;
16 /
v_list_parentID count = 4
v_list_pNummer count = 24
PL/SQL procedure successfully completed.
SQL>
(*)在12c中,我们可以使用SQL中的包规范中声明的类型。
答案 1 :(得分:0)
您需要使用MEMBER OF
子句在SQL语句中构建inlist
。另请注意,无法在匿名块中创建类型,并在子句中的SQL语句中使用它,就像您所做的那样。您必须在PLSQL块之外声明类型,然后使用它:
CREATE OR REPLACE TYPE array_of_numbers IS TABLE OF NUMBER ;
/
DECLARE
v_list_parentID array_of_numbers;
v_list_pNummer array_of_numbers;
BEGIN
SELECT DBUID
BULK COLLECT INTO v_list_parentID
FROM OS_SYS.V_CATALOG
WHERE PARENTID = 1;
SELECT PRIMITIVUMNUMMER
BULK COLLECT INTO v_list_pNummer
FROM OS_CW.CW_FELDDATEN
WHERE KATALOG MEMBER OF v_list_parentID;
END;
在此处查看更多信息: http://www.oracle-developer.net/display.php?id=301