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

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

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

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

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

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

数据库中的并发性是一把双刃剑。正如Chris指出的,在记录错误的过程中添加异常肯定会有所帮助。在为多用户环境开发时,有一些事情需要注意。问题可能是你正在经历的。