在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中有多條記錄,還是報錯的