PL/SQL Нет данных Обнаружена ошибка в цикле

Я не получаю данные об ошибке при циклическом выполнении массива. У немедленного выполнения есть данные, но цикл 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;

Заранее спасибо за помощь.

Mathew

1 ответ

Решение

FORALL предназначен для массового DML, а не для циклического прохождения данных. Синтаксическая диаграмма показывает это:

Быть педантичным, SELECT это форма DML, хотя обычно она считается отдельной от команд, которые изменяют объекты. Возможно, поэтому оригинальный код работает, но выдает ошибку во время выполнения, а не во время компиляции.

Если все, что вам нужно, это циклически проходить через данные, просто используйте курсор для цикла, как это. Oracle автоматически использует массовый сбор для этих типов циклов:

begin
    for employees in
    (
        SELECT  lnm.code FROM employee lnm
    ) loop
        --Do something here.
        null;
    end loop;
end;
/
Другие вопросы по тегам