Основная причина ORA-06519 - PullRequest
       13

Основная причина ORA-06519

0 голосов
/ 23 ноября 2018
Fehler beim Start in Zeile : 1 in Befehl -
DECLARE 
  retval NUMBER;
BEGIN
    MONITORING.PERFORM_CHECK(1000705, retval);
END;
Fehlerbericht -
ORA-06519: Aktive lokale Transaktion erkannt und Rollback durchgeführt
ORA-06512: in "RR_MONITORING.MONITORING_ACTIVITY_LOG", Zeile 13
ORA-06512: in "RR_MONITORING.MONITORING", Zeile 43
ORA-06502: PL/SQL: numerischer oder Wertefehler: character string buffer too small
ORA-06512: in "RR_MONITORING.MONITORING_ACTIVITY_LOG", Zeile 10
ORA-06512: in "RR_MONITORING.MONITORING", Zeile 259
ORA-06519: Aktive lokale Transaktion erkannt und Rollback durchgeführt
ORA-06512: in "RR_MONITORING.MONITORING_ACTIVITY_LOG", Zeile 13
ORA-06512: in "RR_MONITORING.MONITORING", Zeile 1129
ORA-01422: Exakter Abruf gibt mehr als die angeforderte Zeilenzahl zurück
ORA-06512: in Zeile 4
06519. 00000 -  "active autonomous transaction detected and rolled back"
*Cause:    Before returning from an autonomous PL/SQL block, all autonomous
           transactions started within the block must be completed (either
           committed or rolled back). If not, the active autonomous
           transaction is implicitly rolled back and this error is raised.
*Action:   Ensure that before returning from an autonomous PL/SQL block,
           any active autonomous transactions are explicitly committed
           or rolled back.

Какая из этих строк сообщения об ошибке содержит основную причину ошибки?Возможно ли, что предыдущее действие вызвало ошибку, или ошибка должна быть в коде?«Слишком маленький буфер символьной строки» - ошибка в ACTIVITY_LOG или в другом месте?

create or replace PROCEDURE "MONITORING_ACTIVITY_LOG" (IN_KPI_DEF_ID_VAL IN VARCHAR DEFAULT 0,IN_OBJECT IN VARCHAR) AS
  PRAGMA AUTONOMOUS_TRANSACTION;

err_code VARCHAR(100);
err_msg VARCHAR(200);

BEGIN

    err_code :=SUBSTR(SQLCODE, 1, 100);
    err_msg := SUBSTR(SQLERRM, 1, 200);
    Insert into ACTIVITY_LOG(KPI_DEF_ID,EXCEPTION_IN,OBJECT,SQL_ERROR_CODE,SQL_ERROR_MESSAGE,TIMESTAMP) VALUES (IN_KPI_DEF_ID_VAL,'MONITORING',IN_OBJECT,err_code,err_msg,SYSDATE);

END;    

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Похоже, это началось с "ORA-01422: точная выборка возвращает больше, чем запрошенное количество строк" в строке 1129 из MONITORING.PERFORM_CHECK (возможно, select into), которая вызвалавызов журнала ошибок, который сам по себе завершился неудачно с ORA-06519 из-за отсутствия commit для его автономной транзакции.

Также, как представляется, существует "ORA-06502: ошибка с числом или значением:слишком мал символьный буфер строки " в err_msg := SUBSTR(SQLERRM, 1, 200);, хотя трудно понять, почему, поскольку он определен как varchar(200) (кстати, varchar2).Я не уверен, почему вы все равно хотите его урезать, так как можете потерять полезную информацию.Лично я бы использовал sqlerrm напрямую и убедился бы, что столбец имеет соответствующий размер.(Обратите внимание, что ваш фактический стек ошибок имеет длину 681 байт, а его усечение до 200 удаляет большинство деталей, которые вы ищете.)

Я никогда не знал, что sqlcode - полезная вещь для захвата, иЯ предпочитаю хранить пакет, процедуру, номер строки, стек вызовов, модуль, действие, информацию о клиенте, пользователя, пользователя ОС и т. Д.

0 голосов
/ 23 ноября 2018

ORA-06519 является коренной причиной самого себя.По вашей трассировке у вас есть несвязанные сообщения об ошибках из других частей вашего приложения, которые инициируют вызов к MONITORING_ACTIVITY_LOG, для регистрации сообщений об ошибках.

Итак, ORA-06519.Ваша процедура объявляет AUTONOMOUS_TRANSACTION pragma.Объем такой транзакции - это процедура, которая ее объявляет.Таким образом, вам нужно закрыть автономную транзакцию, выдав commit до окончания процедуры.

create or replace PROCEDURE  "MONITORING_ACTIVITY_LOG" 
   (IN_KPI_DEF_ID_VAL IN VARCHAR DEFAULT 0,IN_OBJECT IN VARCHAR) 
AS
  PRAGMA AUTONOMOUS_TRANSACTION;
  err_code VARCHAR(100);
  err_msg VARCHAR(200);    
BEGIN

    err_code :=SUBSTR(SQLCODE, 1, 100);
    err_msg := SUBSTR(SQLERRM, 1, 200);
    Insert into ACTIVITY_LOG(KPI_DEF_ID,EXCEPTION_IN,OBJECT,SQL_ERROR_CODE,SQL_ERROR_MESSAGE,TIMESTAMP) 
    VALUES (IN_KPI_DEF_ID_VAL,'MONITORING',IN_OBJECT,err_code,err_msg,SYSDATE);
    commit;
END;    
...