November | ||||||
---|---|---|---|---|---|---|
Sun | Mon | Tue | Wed | Thu | Fri | Sat |
27 | 28 | 29 | 30 | 31 | 1 | 2 |
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
對NVL(),Decode()等幾個Oracle函數的猜測
今天有個需求,要在存儲過程中取出當天的一些配置進行比較。但是這個配置是每天輸入的,那麼當尚未輸入的時候,這個比較會報出“NO_DATA_FOUND”的錯誤。解決辦法當然也有,在之前做個判斷或者在之後的exception裡進行一些操作都可以。但是兩者都會有更多的語句要寫,讓我很煩躁。我於是想用NVL來實現。
select nvl(replyexpected,'1') from USR_DFW_SCHE where SendDay=trunc(sysdate)
今天的配置已經輸入了,自然這條語句可以正確取出值。為了測試尚未輸入記錄的情況,我將sysdate改成了sysdate+1,也就是:
select nvl(replyexpected,'1') from USR_DFW_SCHE where SendDay=trunc(sysdate+1)
結果返回的不是我預想中的'1',而是什麼也沒有。
採用Decode()函數也一樣:
select decode(replyexpectd,NULL,'1',replyexpected) from USR_DFW_SCHE where SendDay=trunc(sysdate+1)
結果無任何返回。
將語句分解,在當天記錄存在的情況下,select '1' from USR_DFW_SCHE where SendDay=trunc(sysdate) 返回 ‘1’,而 select '1' from USR_DFW_SCHE where SendDay=trunc(sysdate+1) 這樣連滿足條件的記錄都沒有的查詢,則不返回任何結果。
由此,我想大致可以推斷Oracle的NVL()和Decode()函數的內部實現應該是這樣的過程:
select A from TB_C where cond=D;
if (A is null) then
select B into result from TB_C where cond=D;
return B;
end if;