如何在 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 存储过程运行时只提交一个查询的主要内容,如果未能解决你的问题,请参考以下文章

oracle存储过程中循环调用存储过程

如何将组事务提交到 oracle 中的存储过程

在 Oracle 的存储过程中动态运行查询

如何让oracle job定时调用一个有参的存储过程

oracle数据库中存储过程plsql能查但java查询不到,其他表查询都可以,而且上周该存储过程也是可以的。

水晶报表可以连接oracle的存储过程吗