ORACLE-NUMBER vs DECIMAL
| | 0 | | ![]() |
又發現一個ORACLE的"特性"。
首先,ORACLE Function的傳回類別不能指定資料長度或精確度,我心中的直覺是,那會依RETURN數值的精確度而定吧?
我在函數中錯用了不太常用的DECIMAL型別。DECIMAL也可以跟NUMBER一樣宣告總位數及小數位數,但基於Function的限制,RETURN類別只能寫DECIMAL(不能指定精確度),內部運算則先宣告Result DECIMAL(7,6), 再RETURN Result。
測試結果,傳回值一律被轉成整數。但如果我用NUMBER取代DECIMAL,則可以順利傳回小數部分。
我把這些發現整理成以下的Sample,其中JEFFFUNCD()傳回3,而JEFFFUNCN()傳回3.14159。
create or replace function JEFFFUNCD
return
decimal
is
Result decimal(7,6);
begin
Result := 3.14159;
return Result;
end JEFFFUNCD;
create or replace function JEFFFUNCN
return
number
is
Result number(7,6);
begin
Result := 3.14159;
return Result;
end JEFFFUNCN;
SELECT JEFFFUNCD(), JEFFFUNCN() FROM DUAL;
Google了一下,找到一份詳細的說明,由對照表可知,DECIMAL與NUMERIC在未指定小數精確度時,會預設小數位數為零,而NUMBER則否。換句話說,如果指定RETURN型別為DECIMAL(或NUMERIC),則會因小數位數為零,注定了永遠只能傳回整數。
但我還是不明白,為什麼RETURN的型別不能指定精確度或資料長度?
Comments
Be the first to post a comment