В целях отладки мне нужно поднять сообщение уровня приложения на основе данного флага. Вот код исключения
EXCEPTION
WHEN dml_errors THEN
l_errors := SQL%BULK_EXCEPTIONS.COUNT;
S_Publish('I', 'Number of statements that failed: ' || l_errors);
FOR i IN 1..l_errors LOOP
S_Publish('I', 'Error #' || TO_CHAR(i) || ' occurred during '|| 'iteration #' || SQL%BULK_EXCEPTIONS(i).ERROR_INDEX);
S_Publish('I', 'Error message is ' || SQLERRM(-SQL%BULK_EXCEPTIONS(i).ERROR_CODE));
S_Publish('I', 'Failing Record ID is ' || sap_tbl_ins(SQL%BULK_EXCEPTIONS(i).ERROR_INDEX).DEVICE_PIN);
END LOOP;
IF g_app_error_flag THEN
raise_application_error(-20707, 'Fatal Error: Replication script exceptions', TRUE);
END IF;
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error on record:' || l_zzman);
S_Publish('I', 'SAP_EQUI Update: Failure processing record ' || l_zzman);
S_Publish ('F');
IF g_app_error_flag THEN
raise_application_error(-20708, 'Fatal Error: Replication script exceptions', TRUE);
END IF;
Теперь, учитывая этот код, повышение_аппликации_еррор должно вызывать всякий раз, когда ** g_app_error_flag имеет значение true. Однако во всех случаях (я имею в виду среду тестирования, в которой я намеренно отказываю сценарий, добавив некоторое ограничение на таблицу), все, что я вижу, это ошибка DML, т.е.
ORA-01403: no data found
ORA-06512: at "DBNAME.PRODUCT_COPY_PACKAGE", line 1808
ORA-24381: error(s) in array DML
ORA-06512: at "DBNAME.PRODUCT_COPY_PACKAGE", line 84
ORA-06512: at line 3
Не могли бы вы, ребята, предложить, что происходит?
P.S:
вот определение для S_Publish. В S_Publish нет «повышения».
PROCEDURE S_Publish (i_type IN VARCHAR2,
i_msg IN VARCHAR2 DEFAULT NULL) IS
BEGIN
CASE
WHEN i_type = 'G' THEN
IF g_debug_flag
THEN
INSERT INTO logtable (tstamp,line) values (SYSDATE, i_msg);
COMMIT;
g_counter := 0;
END IF;
WHEN i_type = 'F' THEN
g_err_code := SQLCODE;
g_err_msg := TO_CHAR(g_err_code)||' '||SUBSTR(SQLERRM, 1, 100);
INSERT INTO logtable (tstamp,line) values (SYSDATE, g_err_msg);
COMMIT;
WHEN i_type = 'I' THEN
INSERT INTO logtable (tstamp,line) values (SYSDATE, i_msg);
COMMIT;
g_counter := 0;
END CASE;
END S_Publish;
После небольшой отладки вот что я понял до сих пор. Я не знаю, что за этим стоит
Таким образом, проблема в том, что программа завершает работу, как только завершается печать ошибок, то есть FOR i IN 1..l_errors LOOP
. Программа выходит на END LOOP
. Почему что-то после этого не выполняется?