【问题标题】:Oracle - Update statement in Stored Procedure does not work once in a whileOracle - 存储过程中的更新语句偶尔不起作用
【发布时间】:2014-04-10 20:51:21
【问题描述】:

我们有一个存储过程,可以从 oracle 数据库中的一些临时表中将数据插入到表中。插入后有一条更新语句,根据某些检查更新同一表中的标志。在存储过程提交结束时发生。 问题是更新适用于 95% 的情况,但在某些情况下无法更新。当我们尝试在不更改任何内容的情况下再次运行它时,它可以工作。即使尝试在其他时间对相同的数据执行相同的存储过程,也可以完美地工作。我在存储过程的逻辑中没有发现任何问题。我觉得存在一些我们无法找到的数据库级别问题(可能与并发性有关)。对此的任何想法都会非常有帮助。

【问题讨论】:

  • 数据库中的并发是两把刃剑。正如 Chris 所指出的,在记录错误的过程中添加一个异常肯定会有所帮助。在为多用户环境进行开发时,您需要注意一些事项。 Lost Update 问题可能就是您遇到的问题。

标签: oracle


【解决方案1】:

没有看到源代码,我们只是猜测。我能想到的最明显的建议是,它在某些情况下会在某个地方遇到异常,并且永远不会到达提交。另一种可能是执行过程中,表有锁,失败时。

进一步调查的最佳方法可能是添加一个异常处理程序,将异常写入某个表或文件并查看引发了什么错误,例如

-- create a logging table
create table tmp_error_log (timestamp timestamp(0), Error_test varchar2(1000));

-- add a variable to your procedure declaration
v_sql        varchar2(1000);

-- add an exception handler just before the final end; statement on your procedure
exception
  when others then
     begin
        v_sql := 'insert into tmp_error_log values(''' || 
                 to_char(sysdate, 'DD-MON-YYYY HH24:MI:SS') || ''', ''' || SQLERRM || ''')';
        dbms_output.put_line(v_sql);
        execute immediate v_sql;
        commit;
     end;

-- see what you get in the table
select * from tmp_error_log;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多