高手们: 今天我们公司遇到一件非常奇怪的问题:
有一个存储过程名为:SP_WIP_CHECK_SSN:
它有调用其气他存储过程
create or replace procedure SP_WIP_CHECK_SSN
(SSN:VARCHAR2,...)
declare
res:varchar2(200);
...
begin
sp1;
sp2;
sp3;
res:='OK';
SP4(SSN,res);----对于SP4来说:res是输出参数,并且任何情况下,sp4输出的res永远都不会为-1.
if res <> 'OK' then
insert into error_table(...);-----------抛出问题,res=-1
end if;
exception
when other
insert into error_table(...);
end;现在的问题程式调用这个SP_WIP_check_ssn的存储过程时,执行到SP4时偶尔会抛出RES=-1.那只要我重启程式重新执行就没问题了,这个问题也不是一直发生,偶发会发生。不知道各位高手有没有遇见类型问题,首先确认不是oracle游标超时造成的,在线等待,谢谢!
有一个存储过程名为:SP_WIP_CHECK_SSN:
它有调用其气他存储过程
create or replace procedure SP_WIP_CHECK_SSN
(SSN:VARCHAR2,...)
declare
res:varchar2(200);
...
begin
sp1;
sp2;
sp3;
res:='OK';
SP4(SSN,res);----对于SP4来说:res是输出参数,并且任何情况下,sp4输出的res永远都不会为-1.
if res <> 'OK' then
insert into error_table(...);-----------抛出问题,res=-1
end if;
exception
when other
insert into error_table(...);
end;现在的问题程式调用这个SP_WIP_check_ssn的存储过程时,执行到SP4时偶尔会抛出RES=-1.那只要我重启程式重新执行就没问题了,这个问题也不是一直发生,偶发会发生。不知道各位高手有没有遇见类型问题,首先确认不是oracle游标超时造成的,在线等待,谢谢!
可以肯定的是你的代码的问题,ORACLE的BUG多,但不至于这么低级res:= 'OK ';
SP4(SSN,res);----对于SP4来说:res是输出参数,并且任何情况下,sp4输出的res永远都不会为-1.
---这里,可能res=-1了
if res <> 'OK ' then
-----------------------------这,做了啥操作没?把res设成-1了
insert into error_table(...);-----------抛出问题,res=-1
end if;
估计是sp4存储过程里面的代码报的错误,楼主在plsql里面,debug跟踪下,看出错在哪里!
你的INSERT 完没有COMMIT,错误也没有ROOLBACK
以及插入错误 信息后COMMIT
再试试
如果数据没有提交,那为什么我能到ERROR_TABLE表里查到这个数据,我不知道你这里所指的错误是指什么错误
不好意思!由于这是公司的代码,拿不出来,只知道大概的逻辑:
CREATE OR REPLACE SP4
(SSN:VARCHAR,work_group:varchar,OUT RES VARCHAR)
BEGIN
RES:='OK';
if work_group in('a','b','c') then
begin
....
end;
excpetion
when other
insert into error_table(...)
END;这是SP4的主要逻辑,SP4逻辑其实很简单,那现在SP_WIP_CHECK_SSN 在调用这个过程之后,
SP('ssn','d',RES);
这个SP_WIP_CHECK_SSN存储过程是被DELPHIS编写的程序调用,就是说有时候会出现RES=-1的情况,那假如出现这种情况,重复执行一直报错,但是我重启程序,再来执行就没有问题了。
如果能跟踪错误,就不用麻烦大家了,现在的问题就是这个异常具有偶然性,根本不知道它什么时候抛出来的,而同样的条件,重启程序再次执行就没问题了。我想问问是不是跟ORACLE的同义池,因为就是这SP4没有建同义池
Oracle 在下面情况提交事务: 发出一个COMMIT语句。
执行DDL语句时。
离开Oracle时。
CREATE OR REPLACE SP4
(SSN:VARCHAR,work_group:varchar,OUT RES VARCHAR)来看,OUT参数不是NOCOPY的,所以返回-1的话,是说SP4正常执行成功了(也就是SP4没有抛出异常)。在SP4中,能搜索到-1不?
(SSN:VARCHAR2,...)
declare
res:varchar2(200);
...
begin
sp1;
sp2;
sp3;
res:= 'OK ';
SP4(SSN,res);----对于SP4来说:res是输出参数,并且任何情况下,sp4输出的res永远都不会为-1. --在这里抓BUG,如果res=-1,抛出异常.
if (res = -1) then
raise_application_error(-20001, '抛出异常,最好把参数什么的都打印出来');
end if; if res <> 'OK ' then
insert into error_table(...);-----------抛出问题,res=-1
end if;
exception
when other
insert into error_table(...);
end;
....
if work_group in('a','b','c') then
sp4('ssn',work_group,res);
end if;
....
也就是说SP_WIP_CHECK_SSN调用SP4的概率减少了许多,今天观察了一天,都没有发生抛出-1的异常.
真的好难想象这是为什么?