Исходя из отступа в вашем коде, похоже, что вы намерены заключить, что если есть ошибка деления на ноль, calificacion
устанавливается в 1, а затем выполняется обработка исключений. Это не то, что вы написали. Все между EXCEPTION
и END process_data
является частью вашего обработчика исключений. Таким образом, вы вставляете в tabla_ac
только в том случае, если произошла ошибка деления на ноль.
EXCEPTION
WHEN e_div_zero THEN
calificacion := -1;
INSERT INTO TABLA_AC AC (AC.AC_REGLA, AC.AC_FECHA_CALIFICACION, AC.AC_CALIFICACION, AC.AC_ARCHIVONOTAS_ID)
VALUES (REGLA, TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS'), CALIFICACION, NOTAS_DATOS_ID_IN );
FilasAfectadas:= SQL%RowCount;
COMMIT;
END PROCESS_DATA;
Я ожидаю, что вы хотели что-то подобное с дополнительным вложенным блоком PL / SQL
BEGIN
BEGIN -- BEGIN the new nested PL/SQL block
IF (CORRECTAS_IN IS NOT NULL AND ERRONEAS_IN IS NOT NULL) THEN
<<rest of your code>>
END IF;
EXCEPTION
WHEN e_div_zero THEN
calificacion := -1;
END; -- END the nested PL/SQL block
INSERT INTO TABLA_AC AC (AC.AC_REGLA, AC.AC_FECHA_CALIFICACION, AC.AC_CALIFICACION, AC.AC_ARCHIVONOTAS_ID)
VALUES (REGLA, TO_CHAR(SYSDATE, 'MM-DD-YYYY HH24:MI:SS'), CALIFICACION, NOTAS_DATOS_ID_IN );
FilasAfectadas:= SQL%RowCount;
COMMIT;
END PROCESS_DATA;
Несколько других комментариев, не связанных с вашей непосредственной проблемой ..
1) Если вы хотите иметь оператор IF
с несколькими ELSE
условиями, используйте ELSIF
вместо запуска нового IF
заявления. Таким образом, вы не получите полдюжины END IF
операторов подряд. Гораздо разумнее сказать:
IF <<condition 1>> THEN
<<do something>>
ELSIF <<condition 2>> THEN
<<do something else>>
ELSIF <<condition 3>> THEN
<<do a third thing>>
ELSE
<<do a final thing>>
END IF;
2) Если у вас есть COMMIT
в вашей процедуре, подавляющее большинство времени выполнения будет результатом попытки запустить 100 000 коммитов. Это займет в сотни раз больше времени, чем вставка 100 000 строк и выполнение одного коммита во внешней процедуре.
Похоже, что ваш код не предназначен для повторного входа, поэтому, вероятно, функционально проблематично иметь временные коммиты. Что произойдет, если вы обработали 50 000 строк и ваш код выдает исключение? У вас не было бы очевидного способа перезапустить процесс в строке 50,001, поэтому, если вы перезапустите цикл, вы получите 150 000 строк в tabla_ac
, а не 100 000, что вряд ли будет тем, что вы хотели.