【问题标题】:Root cause of ORA-06519ORA-06519 的根本原因
【发布时间】:2018-11-23 18:14:35
【问题描述】:
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;    

【问题讨论】:

    标签: oracle plsql error-handling transactions


    【解决方案1】:

    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;    
    

    【讨论】:

    • 很遗憾,我只能接受一个答案作为已接受的答案,否则我也会接受你的答案。
    • 嗯。您的问题是关于 ORA-06519。我的回答涉及该主题,因此我认为您应该接受我的回答。未来的寻求者在尝试调试他们的自治事务时发现这个线程会很困惑,发现接受的答案对他们没有帮助。
    【解决方案2】:

    在我看来,它从MONITORING.PERFORM_CHECK(可能是select into)的第1129 行的“ORA-01422:精确提取返回的行数超过请求的行数”开始,它触发了对错误记录器的调用,由于其自​​主事务缺少 commit 而导致 ORA-06519 本身失败。

    err_msg := SUBSTR(SQLERRM, 1, 200); 上似乎还有一个 “ORA-06502:数字或值错误:字符串缓冲区太小”,尽管很难理解为什么,因为它被定义为 varchar(200) (顺便说一下,应该是varchar2)。我不确定你为什么要截断它,因为你可能会丢失有用的信息。就我个人而言,我会直接使用sqlerrm 并确保列的大小足够。 (请注意,您的实际错误堆栈长度为 681 字节,将其截断为 200 会删除您正在寻找的大部分细节。)

    我从来不知道sqlcode 是一个有用的东西来捕获,我更喜欢存储包、过程、行号、调用堆栈、模块、操作、客户端信息、用户、操作系统用户等。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-12
      • 1970-01-01
      • 2019-01-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多