又發現一個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

Post a comment