2017-05-29 63 views
0

我想比较表OS_CW.CW_FELDDATEN属性的PRIMITIVUMNUMMER(NOT NULL NUMBER(38))与本地数组中的值v_list_pNummber。这是我到目前为止有:如何在SELECT INTO语句中使用数字表

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; 

当运行上面的代码,我得到这个错误:

Error report -
ORA-06550: line 28, column 104:
PLS-00382: expression is of wrong type
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:

我怎样才能比较表NUMBER INDEX BY BINARY_INTEGER列(数字)?

谢谢!

回答

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

2

SQL不能使用本地PL/SQL范围内声明的类型。您需要在SQL (*)来定义它:

SQL> create TYPE array_of_numbers IS TABLE OF NUMBER ; 
    2/

Type created. 

SQL> 

然后使用表()操作的第一集合转换成您可以用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包规范声明的类型。