Невозможно вызвать сообщение об ошибке приложения - PullRequest
3 голосов
/ 11 ноября 2011

В целях отладки мне нужно поднять сообщение уровня приложения на основе данного флага. Вот код исключения

  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. Почему что-то после этого не выполняется?

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

Итак, проблема была в S_Publish.таблица, на которую он ссылается, т.е. sap_tbl_ins, основана на 0.SQL%BULK_EXCEPTIONS(i).ERROR_INDEX - это, в основном, номер итерации, когда это не удалось.Таким образом, обращение к индексу на основе 0 с числом вызывает исключение «массив вне границ».Я только что понял и изменил формулу на

S_Publish('I', 'Failing Record ID is ' || sap_tbl_ins((SQL%BULK_EXCEPTIONS(i).ERROR_INDEX)-1).DEVICE_PIN);

и она работает нормально.

0 голосов
/ 17 ноября 2011

ОК, вопросы:

1) Каков код в / около строки 1808 в PRODUCT_COPY_PKG. Вот откуда возникает первая ошибка.

2) Происходят ли вставки в logtable? (т. е. действительно ли выполняется этот блок исключений?)

3) Выходные данные этого стека ошибок поступают из ваших операторов dbms_output? Или это дамп стека из Oracle во время выполнения?

Примечание по стилю: Я надеюсь, что S_PUBLISH определяется с помощью PRAGMA AUTONOMOUS_TRANSACTION, в противном случае ваш COMMIT может совершать частично завершенную транзакцию, если ваш код находился в процессе выполнения каких-либо вещей, когда произошла ошибка ..

0 голосов
/ 12 ноября 2011

Поскольку мы не видим весь код, мы должны полагаться на вас, что, когда вы намеренно делаете сбой сценария, добавляя какое-то ограничение на таблицу, этот блок исключений, который вы опубликовали, является тем, который активный. Так что, если этот блок вступает в действие, причиной того, что вы не видите своего «Raise_application_error (-20707, .....») или второго с -20708, может быть то, что процедура «S_Publish» вызывает само исключение Это не будет зафиксировано в том же блоке исключений, в котором они выполняются, если вы не окружите их дополнительным блоком. Чтобы проверить эту теорию, попробуйте временно удалить вызовы к ней и посмотреть, получите ли вы поднятую ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...