如何捕获 PL/SQL 代码中第一次提交发生在 Oracle 中的事件?

How to catch the event where in PL/SQL code the first commit occurs in Oracle?

Oracle 中的方式是否会自动捕获 PL/SQL 代码中第一次提交发生的事件?

我对 PL/SQL 过程有一个大问题,它不应该做任何提交,但它在某处做了一个提交。

此程序运行大量 pl/sql 代码,大量动态 pl/sql 代码,一些包被包装,一些包未被调试。

也许有人遇到过类似的问题,可以帮助我吗?

您的 PL/SQL 块将永远不会提交更改,除非您明确提到 COMMIT

但是,您可能将 DDL 语句作为 dynamic SQL 执行,这可能会进行隐式提交。在代码中搜索提交。

你可以看看 USER_SOURCE.

SELECT * 
   FROM USER_SOURCE
  WHERE NAME = '<PROCEDURE NAME IN UPPER CASE>'
  AND   TYPE = 'PROCEDURE'
  AND   UPPER(TEXT) LIKE '%COMMIT%'

更新

要查找 DDL 语句,您可以查找 CREATE、DROP、ALTER

等关键字
SELECT * 
   FROM USER_SOURCE
  WHERE NAME = '<PROCEDURE NAME IN UPPER CASE>'
  AND   TYPE = 'PROCEDURE'
  AND   UPPER(TEXT) LIKE '%CREATE%'
  OR    UPPER(TEXT) LIKE '%DROP%'
  OR    UPPER(TEXT) LIKE '%ALTER%'

我找到了答案:

ALTER SESSION DISABLE COMMIT IN PROCEDURE

此命令禁用提交的可能性,最重要的是 对我来说很重要,oracle 错误消息显示了确切的位置 在 pl/sql 代码中,提交是。

SQL> create or replace procedure tst_commit is
  2  begin
  3    dbms_output.put_line('before commit');
  4    COMMIT;
  5    dbms_output.put_line('after commit');
  6  end tst_commit;
  7  /
Procedure created

SQL> BEGIN
  2    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE COMMIT IN PROCEDURE';
  3    INSERT INTO viliusg.log VALUES(SYSDATE,'test commit');
  4    tst_commit;
  5     dbms_output.put_line('THE END');
  6  END;
  7  /
BEGIN
    EXECUTE IMMEDIATE 'ALTER SESSION DISABLE COMMIT IN PROCEDURE';
  INSERT INTO viliusg.log VALUES(SYSDATE,'test commit');
  tst_commit;
    dbms_output.put_line('THE END');
END;
ORA-00034: cannot COMMIT in current PL/SQL session
ORA-06512: at "FORPOST.TST_COMMIT", line 4
ORA-06512: at line 4