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