高手们:       今天我们公司遇到一件非常奇怪的问题:
有一个存储过程名为: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游标超时造成的,在线等待,谢谢!

解决方案 »

  1.   

    sp4的代码呢? 大概给出来看看。
    可以肯定的是你的代码的问题,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; 
      

  2.   


    估计是sp4存储过程里面的代码报的错误,楼主在plsql里面,debug跟踪下,看出错在哪里!
      

  3.   

    insert   into   error_table(...); 
    你的INSERT 完没有COMMIT,错误也没有ROOLBACK
      

  4.   

    表被锁了?你在错误的时候加上ROLLBACK ,
    以及插入错误 信息后COMMIT
    再试试
      

  5.   


    如果数据没有提交,那为什么我能到ERROR_TABLE表里查到这个数据,我不知道你这里所指的错误是指什么错误
      

  6.   


    不好意思!由于这是公司的代码,拿不出来,只知道大概的逻辑:
    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的情况,那假如出现这种情况,重复执行一直报错,但是我重启程序,再来执行就没有问题了。
      

  7.   


    如果能跟踪错误,就不用麻烦大家了,现在的问题就是这个异常具有偶然性,根本不知道它什么时候抛出来的,而同样的条件,重启程序再次执行就没问题了。我想问问是不是跟ORACLE的同义池,因为就是这SP4没有建同义池
      

  8.   

    有几种方式会自动提交数据
    Oracle 在下面情况提交事务: 发出一个COMMIT语句。
     执行DDL语句时。
     离开Oracle时。
      

  9.   

    我以前DELPHI调用ADO写的应用程序,跟了3天才找出一个ADO隐式提交的BUG从你的代码:
    CREATE OR REPLACE SP4 
    (SSN:VARCHAR,work_group:varchar,OUT RES VARCHAR)来看,OUT参数不是NOCOPY的,所以返回-1的话,是说SP4正常执行成功了(也就是SP4没有抛出异常)。在SP4中,能搜索到-1不?
      

  10.   

    现在的问题不是执行SQL(INSERT,UPDATE,DELETE)之后,数据库没有任何反应,问题是为什么会抛出-1.
      

  11.   

    在SP4中确实有给一个变量赋值为-1,但是整个SP4中一直都没有给RES赋值为-1。跟了3天才找出一个ADO隐式提交的BUG...请问你这是指?能否说明白点,看是否与我遇到的这个问题有关联?
      

  12.   

    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.     --在这里抓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; 
      

  13.   

    像这种偶尔出现的BUG,本来就不好跟,只有找到重现的方法,才能去解决。
      

  14.   

    今天我们有把SP_WIP_CHECK_SSN这个SP有做一次修改:在调用SP4时,增加一个条件:
    ....
    if work_group in('a','b','c') then
       sp4('ssn',work_group,res);
    end if;
    ....
    也就是说SP_WIP_CHECK_SSN调用SP4的概率减少了许多,今天观察了一天,都没有发生抛出-1的异常.
    真的好难想象这是为什么?
      

  15.   

    其实在我在往ERROR_TABLE里插入资料的时候,都已经包括了详细的错误信息,包括电脑名、IP、RES、WORK_GROUP...