如何在 Oracle 存储过程运行时只提交一个查询
Posted
技术标签:
【中文标题】如何在 Oracle 存储过程运行时只提交一个查询【英文标题】:How to Commit only one query during Oracle stored procedure runtime 【发布时间】:2019-01-10 06:17:38 【问题描述】:我正在使用 SQL 开发人员。我有一个运行很长时间的存储过程。我需要跟踪运行期间发生的情况。
我试过DBMS_output.put_line('trace');
。但它在存储过程完成后打印。我也不能使用DBMS_trace
(可能是我正在使用的旧版本)。
所以我想出了一个主意。我想在存储过程运行时插入表中。如何在存储过程中只提交插入查询?
【问题讨论】:
你可能想看看"How to commit individual transaction in Oracle PLSQL"。 【参考方案1】:我看到了两种可能性。
您要么编写一个将日志消息插入表的过程。使用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 = ...;
【讨论】:
【参考方案2】:在这种情况下,您必须使用 Pragma Autonomous 事务。
使用 Pragma Autonomous 创建一个新过程。
PROCEDURE test_autonomous
IS
PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
insert ....
commit;
END test_autonomous;
现在在您的代码中调用此过程。这会做你的伎俩。大家可以使用参数来传递一些你想插入的数据。
【讨论】:
以上是关于如何在 Oracle 存储过程运行时只提交一个查询的主要内容,如果未能解决你的问题,请参考以下文章