Oracle - 存储过程中的Update语句暂时不起作用

时间:2014-04-10 12:21:49

标签: oracle

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

1 个答案:

答案 0 :(得分:0)

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

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

-- 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;