1

循环遍历数组时没有发现数据错误。立即执行有数据,但 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;

在此先感谢您的帮助。

马修

4

1 回答 1

1

FORALL用于批量 DML,而不是用于循环数据。语法图显示了这一点:

在此处输入图像描述

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

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

begin
    for employees in
    (
        SELECT  lnm.code FROM employee lnm
    ) loop
        --Do something here.
        null;
    end loop;
end;
/
于 2016-02-21T05:37:16.047 回答