PL / SQL没有数据在forall循环上发现错误

时间:2016-02-21 00:07:49

标签: loops plsql forall

循环数组时,我没有发现数据发现错误。 execute immediate有数据,但是forall循环没有发现数据错误,也无法迭代集合。

请找到以下代码。 code_arr.FIRST似乎有一些问题。表有数据,执行sql在编辑器上给出数据。能帮忙吗?

create or replace PACKAGE TEST AS
  FUNCTION TEST RETURN NUMBER;
 END;


create or replace PACKAGE BODY TEST AS
  FUNCTION TEST RETURN NUMBER
    IS
        TYPE typ_varchar IS TABLE OF VARCHAR2 (1000) INDEX BY BINARY_INTEGER;
        lv_statement   VARCHAR2 (1000);
        code_arr       typ_varchar;
        var1 varchar(1000);
  BEGIN
        lv_statement :=    'SELECT  lnm.code FROM employee lnm';

        EXECUTE IMMEDIATE lv_statement BULK COLLECT
        INTO code_arr;

          FORALL ix1 IN code_arr.FIRST .. code_arr.LAST SAVE EXCEPTIONS
          SELECT code_arr(ix1) into var1 FROM DUAL;

        RETURN 1;
  END;
END;

提前感谢您的帮助。

马修

1 个答案:

答案 0 :(得分:1)

FORALL适用于批量DML,不适用于循环数据。语法图显示了这个:

enter image description here

为了迂腐,SELECT DML的一种形式,尽管它通常被认为与修改对象的命令是分开的。这可能就是为什么原始代码有效,但在运行时而不是在编译时抛出错误。

如果你需要做的只是循环数据,只需像这样使用游标循环。 Oracle自动对这些类型的循环使用批量收集:

begin
    for employees in
    (
        SELECT  lnm.code FROM employee lnm
    ) loop
        --Do something here.
        null;
    end loop;
end;
/