2016-02-21 6 views
1

Я получаю сообщение об ошибке поиска при переходе по массиву. Операция немедленная имеет данные, но цикл forall не дает ошибки поиска данных и не может выполнять итерацию по коллекции.PL/SQL Нет данных, найденных ошибкой в ​​forall loop

Пожалуйста, найдите код ниже. 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

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

Большое спасибо – user3053015

 Смежные вопросы

  • Нет связанных вопросов^_^