【问题标题】:PL/SQL No Data found error on forall loopPL/SQL 在 forall 循环中找不到数据错误
【发布时间】:2016-06-02 12:32:49
【问题描述】:

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

提前感谢您的帮助。

马修

【问题讨论】:

    标签: loops plsql forall


    【解决方案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;
    /
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2014-03-30
      • 2013-12-27
      • 2013-10-08
      • 1970-01-01
      • 2016-11-08
      • 1970-01-01
      相关资源
      最近更新 更多