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;
/