oracle - 如何在 Oracle 存储过程运行时只提交一个查询
问题描述
我正在使用 SQL 开发人员。我有一个运行很长时间的存储过程。我需要跟踪运行期间发生的情况。
我试过了DBMS_output.put_line('trace');
。但它在存储过程完成后打印。我也不能使用DBMS_trace
(可能是我正在使用的旧版本)。
所以我想出了主意。我想在存储过程运行时插入表中。如何在存储过程中仅提交该插入查询?
解决方案
我看到了两种可能性。
您可以编写一个将日志消息插入表的过程。用 声明此过程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 = ...;