代码大体如下:
long nVar;
nVar = 0;
select xx into :nVar
if ( nVar != 0 )
{
    ...
}
else
{
    ...
}
这几行代码的本意是如果从数据库中读取不到值(数据库读取失败,或者记录不存在什么的),做一个事情;否则做另外一件事情。
从代码中可以看到select之后,并没有判断sqlcode,而是直接以变量的值来判断(初始化为0)。在运行过程中,绝大部分情况下都ok,但在极少情况下,我们怀疑在记录不存在(这时sqlcode为1403)的情况下,变量nVar的值也被修改了,因此导致程序做了错误的事情。
在做其他调查的同时,我们想确认一下select into语句,如果发生数据库错误或者记录不存在,oracle是否会修改宿主变量的值呢?请各位高手赐教,或者给点课题确认的资料,多谢!

解决方案 »

  1.   

    begin
       select xx into :nVar;
    except
       when no_datafound then
              nVar := ??; --错误代码,不存在
    end;
      

  2.   

    没太明白ls的意思。
    我的疑问是,nVar在执行select之前被初始化为0;
    select执行之后,记录不存在(sqlcode是1403),但似乎nVar的值被改变了。
    现在也不是很确认是不是oracle修改了,还是其他原因,所以想确认一下:
    如果select语句失败,变量的值有没有可能被修改呢?
      

  3.   

    declare
       v_x  varchar2(50);
    begin
       v_x := 'hello, baby';
       
       begin
           select 'ok, let me see'
             into v_x
             from dual
            where 1 = 2;
            
            dbms_output.put_line(v_x);
       exception
           when no_data_found then
               dbms_output.put_line( sqlerrm );
       end;   dbms_output.put_line(v_x);
    end;经测试,不会修改
      

  4.   

    select xx into :nVar;   --这里如果没有数据,就报异常了,下面的代码能不执行了
    if ( nVar != 0 )
    {
    ...
    }
    else
    {
    ...
    }
      

  5.   

    噢,是我没说清楚,是在c里做的,这个地方不会有异常。
    通常是在select之后判断一下sqlcode,但这里没有判断。
      

  6.   

    pro*c没有用过哈
    你可以直接select一个不存在的记录,然后检查一下nVar的值试一下