首页 > 解决方案 > 如何在 Oracle 存储过程运行时只提交一个查询

问题描述

我正在使用 SQL 开发人员。我有一个运行很长时间的存储过程。我需要跟踪运行期间发生的情况。

我试过了DBMS_output.put_line('trace');。但它在存储过程完成后打印。我也不能使用DBMS_trace(可能是我正在使用的旧版本)。

所以我想出了主意。我想在存储过程运行时插入表中。如何在存储过程中仅提交该插入查询?

标签: oracleplsql

解决方案


我看到了两种可能性。

您可以编写一个将日志消息插入表的过程。用 声明此过程PRAGMA AUTONOMOUS_TRANSACTION

CREATE OR REPLACE PROCEDURE WriteLogMsg(LogMessage IN VARCHAR2) IS
    PRAGMA AUTONOMOUS_TRANSACTION;      
BEGIN

   INSERT INTO T_LOG_ENTRIES (LOG_DATE, LOG_MESSAGE) 
   VALUES (CURRENT_TIMESTAMP, LogMessage);
   COMMIT;

END WriteLogMsg;

或者使用DBMS_APPLICATION_INFO包:

PROCEDURE LONG_RUNNING_PROCEDURE IS
BEGIN

DBMS_APPLICATION_INFO.SET_MODULE('LONG_RUNNING_PROCEDURE', 'Starting');
...

DBMS_APPLICATION_INFO.SET_ACTION('Still working, please be patient'); 
...

DBMS_APPLICATION_INFO.SET_ACTION('Finished');

-- DBMS_APPLICATION_INFO.SET_MODULE(NULL, NULL); -> removes entries for MODULE and ACTION

END;

在程序运行时,您可以查询信息

SELECT USERNAME, MODULE, ACTION
from V$SESSION
where USERNAME = ...;

推荐阅读