日期:2014-05-17  浏览次数:20828 次

请教一个proc select into的问题
代码大体如下:
long nVar;
nVar = 0;
select xx into :nVar
if ( nVar != 0 )
{
  ...
}
else
{
  ...
}
这几行代码的本意是如果从数据库中读取不到值(数据库读取失败,或者记录不存在什么的),做一个事情;否则做另外一件事情。
从代码中可以看到select之后,并没有判断sqlcode,而是直接以变量的值来判断(初始化为0)。

在运行过程中,绝大部分情况下都ok,但在极少情况下,我们怀疑在记录不存在(这时sqlcode为1403)的情况下,变量nVar的值也被修改了,因此导致程序做了错误的事情。
在做其他调查的同时,我们想确认一下select into语句,如果发生数据库错误或者记录不存在,oracle是否会修改宿主变量的值呢?请各位高手赐教,或者给点课题确认的资料,多谢!

------解决方案--------------------
begin
select xx into :nVar;
except
when no_datafound then
nVar := ??; --错误代码,不存在
end;
------解决方案--------------------
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;

经测试,不会修改
------解决方案--------------------
pro*c没有用过哈
你可以直接select一个不存在的记录,然后检查一下nVar的值试一下