8

我正在开发与遗留系统编写的 Oracle PL/SQL 集成的 Java 应用程序。不幸的是,我无法更改这个遗留系统。这个系统的问题是它有时将 COMMIT 语句写入过程。但这导致我无法在我的应用程序级别正确处理事务。

那么是否可以让 oracle 数据库过程忽略提交语句?

我发现 ALTER SESSION DISABLE COMMIT IN PROCEDURE当 PL/SQL 程序尝试提交时,在连接开始时会导致异常。但是是否可以让 Oracle 在不更改 PL/SQL 代码的情况下忽略提交?

4

6 回答 6

6

我在 Oracle 工作了 9 年。我还检查了有关您的问题的未记录参数,我很确定,没有办法让 Oracle 忽略存储过程的提交。

但是,理论上,您可以使用 Oracle 的闪回功能(例如闪回数据库或闪回表)将整个数据库或单个表重置为事务开始之前的状态。但是请注意,如果您是唯一一个在您闪回的对象上更改任何内容的人,那么这只会根据需要起作用。这通常是不现实的。顺便说一句,您还需要考虑闪回功能并非旨在支持这种情况,因此如果您需要闪回任何内容,您的应用程序的性能将不是最佳的。但是,如果您别无选择,这可能是解决您问题的一种方法。

于 2013-06-26T10:47:49.547 回答
6

I don't think you can do that. You'll have to add a parameter to those procedures like"do commit"with a default value true. And you call them with parameter set to false. Pass the parameter value on, if they are nested. That way the legacy code still behaves the same but you get transaction control.

于 2013-06-22T04:05:16.710 回答
2

最好的办法可能是在不影响当前功能的情况下更改 pl/sql 过程。换句话说,添加一个新参数以允许用户忽略提交,但默认为现有功能(提交)。我在类似的情况下做过这个,效果很好。

所以,你会有类似的东西:

create or replace procedure some_proc(
    i_num in number, -- existing parameter
    i_commit in number default 1) -- perform commit? 0=false, else true
as

begin
  -- some DML here

  if (i_commit <> 0) then
    commit;
  end if;

end;

确保将此新参数添加到参数列表的末尾。因此,您的应用程序将为 i_commit 传递 0(假)。

希望有帮助。

于 2013-06-28T14:55:15.143 回答
0

知道程序做了什么会很有帮助。但是,假设该过程修改了有限数量的表中的数据(这就是我们在 PLSQL 中最常做的事情),您可以尝试在该模式上运行闪回查询:

闪回表 TABLE_NAME 到 TIMESTAMP(TO_DATE('06-SEP-2012 23:59:59','DD-MON-YYYY HH24: MI: SS'));

您可以将时间字符串“06-SEP-2012 23:59:59”设置为在您的 JAVA 代码中调用该过程之前的时间。

这是一个糟糕的解决方法,但我想值得一试

于 2013-06-30T18:57:16.183 回答
0

我正在开发与遗留系统编写的 Oracle PL/SQL 集成的 Java 应用程序。不幸的是,我无法更改这个遗留系统。

嗯,这闻起来像政治......“别碰这个,它有效!” 我猜。:(

事实上,COMMIT正如@Tilman Fliegel(和其他人)已经说过的那样,很可能不可能忽略一个声明。如果是这样,那将是您代码库中的一个丑陋的疣。

我不太擅长政治,但我会说如果你不能使用或改变 this,那就不要使用 this。我是说:

  • 如果您无法更改您的程序,因为它们被其他(旧的、不可变的)系统使用,则复制它们,然后修改/重构您的副本,直到您满意为止。如果您能够使您的版本复古兼容,您甚至可以为其他(旧)系统提供一种方式,以便在之后/如果它们被重构时使用您的系统:只需引入“传统模式”输入参数或其他任何东西,cf . 其他答案。
  • 如果您因为无法理解/测试代码而无法更改代码,那么这是一个主要问题。将其丢弃并从头开始(只要您能够这样做)甚至可能更安全。

但也许试图忽略COMMITs 毕竟更容易。人类很难重构……;)

于 2013-07-01T13:30:26.217 回答
0

我发现ALTER SESSION DISABLE COMMIT IN PROCEDURE 当 PL/SQL 程序尝试提交时,在连接开始时会导致异常。

是的,该语句的记录行为是在程序尝试发出提交时强制 ORA-00034 异常。我认为它真的是作为一种测试的东西来识别具有嵌入式提交的过程。

我认为存储过程发出提交被广泛认为是不好的做法。事务的控制权必须属于调用堆栈的顶部。

不幸的是,没有办法忽略那些嵌入的提交。您将不得不重新编写 PL/SQL 例程,或者在调用代码中编写一些变通方法(例如,发出附加 DML 以反转已提交更改的异常处理程序)。

于 2013-06-26T10:27:14.807 回答