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