Ваша процедура имеет некоторые структурные проблемы. Самая насущная проблема - «комментируется оператор открытия и закрытия курсора, потому что я отлаживаю код». Так как открытие в комментариях приводит к сбою FETCH с недопустимым курсором - выборка требует, чтобы курсор был открыт. Вы утверждаете, что на курсоре выдана ошибка FOR l oop. Я думаю, что это было до того, как вы прокомментировали открытое. Курсор FOR выдает открытие для курсора. Который, если курсор открыт, выдает неверный курсор. Вы не можете использовать курсор FOR для открытого курсора. Таким образом, вы либо открываете курсор, обрабатываете эту первую строку (извлекаете), затем закрываете курсор и затем вводите FOR. Не закрывайте курсор после выхода из l oop. У вас есть логическая проблема во вложенной структуре if.
IF cursorDate%FOUND THEN -- El cursor contiene info, sino %NOTFOUND
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- Dentro2!');
IF cursorDate%ROWCOUNT != 0 THEN
DBMS_OUTPUT.PUT_LINE ('OBTAIN_DATE_FIN_ABSENT -- cursor NO vacío!');
ELSE
«if cursorDate% Rowcount! = 0» всегда будет возвращать True. Атрибут курсора% rowcount возвращает количество строк, извлеченных из курсора. Атрибут% Found возвращает True, если последняя выборка вернула строку. Поскольку здесь% Rowcount является подчиненным% Found, это означает, что он никогда не сможет вернуть меньше 1.
Еще одно очевидное утверждение - утверждение
IF v2(i-1) = NULL THEN
У него 2 проблемы. Во-первых, ваша переменная i инициализируется значением 1, поэтому приведенный выше оператор читает v2 (0). Это неверно, значения индекса в pl / sql начинаются с 1. Как только это будет правильно, результирующий оператор никогда не будет True. Вы не можете использовать реляционные операторы с Null; результат, когда вы делаете это всегда Null. Вам нужно "v2 (i) является нулевым". Исправьте эти проблемы, затем, если у вас все еще есть проблемы, отправьте другой вопрос.