oracle 变量赋值
在oracle 中使用 select 字段 into 变量 from 表 where 条件 这种方法给变量赋值时和MSSQL的行为有比较大区别.
在MSSQL中如果在该表中未检索到任何行,则变量的值保持不变,如果检索到多条数据,则会将每一条数据的值依次赋给变量(顺序不保证永远相同) .但是在oracle中,只有取到唯一行的时候才会赋值成功,其它情况都会抛出一个异常.在MSSQL中利用对变量重复赋值可以产生一次非常巧妙的应用,还是非常好的功能.具体两种机制的好坏就不做出评价了.
如果某些情况下我们希望检索不到任何行的时候,该变量保持之前的值即可而不需要抛出异常,这时该怎么办?
同事给出的办法是用BEGIN *** END 隔离再用异常捕捉处理,如下:
BEGIN
select 字段 into 变量 from 表B where 条件;
exception
.....
END;
另一个方案是先查询该表的记录数,再判断是否赋值,如下:
select count(*) into 变量A from 表B where 条件;
if 变量A=1 then
select 字段 into 变量 from 表B where 条件;
end if;
这种方法首先是要对表进行两次检索,其实是写起来比较麻烦.
那么可以采用以下这种方法解决:
select b.字段 into 变量
from dual a left join 表B b on b.条件
这种方法使用dual表让代码变得简单一些.但是如果表B中有多条记录,还是报错的