PLSQL脚本无法将多个值传递到IN()caluse中
我对PLSQL非常陌生,我想将一个数字数组传递到in()子句值中,但Sqldeveloper会抛出以下错误消息:PLSQL脚本无法将多个值传递到IN()caluse中,plsql,oracle11g,Plsql,Oracle11g,我对PLSQL非常陌生,我想将一个数字数组传递到in()子句值中,但Sqldeveloper会抛出以下错误消息: Error report - ORA-06550: line 11, column 60: PLS-00382: expression is of wrong type ORA-06550: line 11, column 53: PL/SQL: ORA-22905: cannot access rows from a non-nested table item ORA-06550:
Error report -
ORA-06550: line 11, column 60:
PLS-00382: expression is of wrong type
ORA-06550: line 11, column 53:
PL/SQL: ORA-22905: cannot access rows from a non-nested table item
ORA-06550: line 10, column 4:
PL/SQL: SQL Statement ignored
06550. 00000 - "line %s, column %s:\n%s"
*Cause: Usually a PL/SQL compilation error.
*Action:
这是我的代码:
DECLARE
TYPE sc IS TABLE OF transactionhistory.NBSUBCOMPANY%TYPE INDEX BY PLS_INTEGER;
arr sc;
BEGIN
arr(0) := 000;
arr(1) := 111;
arr(2) := 222;
arr(3) := 333;
select count(th.CHCARDNUMBER) as transactions from transactionhistory th INNER JOIN cards ch on ch.NBATTMID=th.NBATTMID where th.dtdate>=to_date('01-oct-2016','dd-mon-yyyy') and th.dtdate<to_date('01-nov-2016','dd-mon-yyyy')
and ch.NBSUBCOMPANY IN (select column_value from table (arr))
and ((th.CHTRANSTYPE in ('2940', '2916', '2941', '2942', '2943', '2944', '2945', '2902', '2917', '2925') and th.NBBASEAMT < 0) or (th.CHTRANSTYPE in ('2922', '2923', '2926', '2950', '2951', '2952', '2953', '2954', '2955') and th.NBBASEAMT > 0) or (th.CHTRANSTYPE in ('1101', '1102', '1104', '1105', '1106', '1107', '1109') and th.BASEII_STATUS = 'C') or th.CHTRANSTYPE not in ('2940', '2916', '2941', '2942', '2943', '2944', '2945', '2902', '2917', '2925', '2922', '2923', '2926', '2950', '2951', '2952', '2953', '2954', '2955', '1101', '1102', '1104', '1105', '1106', '1107', '1109'));
END;
声明
sc类型是交易历史记录表。NBSUBCOMPANY%类型索引采用PLS_整数;
arr sc;
开始
arr(0):=000;
arr(1):=111;
arr(2):=222;
arr(3):=333;
从交易历史记录中选择计数(th.CHCARDNUMBER)作为交易,th.NBATTMID=th.NBATTMID,其中th.dtdate>=截止日期('01-oct-2016','dd-mon-yyyyy')和th.dtdate 0)或(th.CHTRANSTYPE in('1101','1102','1104','1105','1106','1107','1109')和th BASEII_状态='C')或th CHTRANSTYPE不在('2940', '2916', '2941', '2942', '2943', '2944', '2945', '2902', '2917', '2925', '2922', '2923', '2926', '2950', '2951', '2952', '2953', '2954', '2955', '1101', '1102', '1104', '1105', '1106', '1107', '1109'));
结束;
请建议我如何通过此考试。您需要解决问题 SQL不支持以您想要的方式使用本地集合类型 下面的示例程序将有助于解决
CREATE OR REPLACE type TEST_TYPE
IS
TABLE OF NUMBER;
您需要在数据库中创建一个类型才能使其工作。可以在包内创建,如果有
DECLARE
TEST_VAR TEST_TYPE := TEST_TYPE();
BEGIN
TEST_VAR.extend(1);
TEST_VAR(TEST_VAR.last) := 222;
TEST_VAR.extend(1);
TEST_VAR(TEST_VAR.last) := 333;
FOR rec IN
(SELECT column_value
FROM TABLE(TEST_VAR)
)
LOOP
dbms_output.put_line(rec.column_value);
END LOOP;
END;
输出
222
333
这样,您就可以使用selectcolumn\u value fromtable(test\u var)
为您的IN()
子句选择列值
此外,您不必遵循extend(i)
部分。您也可以简单地执行以下操作
TEST_VAR TEST_TYPE := TEST_TYPE(222,333);
阅读-您可以使用
子句的成员。见下文:
正如@Sudipta提到的,您不能在PLSQL块中使用标记的集合,您需要在PLSQL块
之外声明它
CREATE OR REPLACE TYPE sc IS TABLE OF NUMBER;
然后
DECLARE
-- TYPE sc IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
arr sc:=sc();
num number;
BEGIN
arr.extend(4);
arr(1) := 0;
arr(2) := 1;
arr(3) := 2;
arr(4) := 3;
Select count(1)
into num
from employee
-- You can use either commented one or uncommented one. your choice.
--where employee_id in (select column_value from table(arr));
where employee_id member of arr;
END;
@XING可能重复感谢回复,但情况不同,我已经访问了URL,他们没有将值传递到IN()中,他们只是像数组上的简单迭代器一样逐个打印值。但我想将整个数组传递到IN()。