如何捕获 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
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