2010-06-01 63 views
7

通常,當您指定函數時,返回數據類型的scale/precision/size是未定義的。PL/SQL的間隔精度函數值

例如,你說FUNCTION show_price RETURN NUMBERFUNCTION show_name RETURN VARCHAR2

您不允許有FUNCTION show_price RETURN NUMBER(10,2)FUNCTION show_name RETURN VARCHAR2(20),並且函數返回值不受限制。 This is documented functionality.

現在,如果我將9999小時(大約400天)推入以下內容,則會出現精度錯誤(ORA-01873)。該限制是因爲the default days precision is 2

DECLARE 
    v_int INTERVAL DAY (4) TO SECOND(0); 
    FUNCTION hhmm_to_interval return INTERVAL DAY TO SECOND IS 
    v_hhmm INTERVAL DAY (4) TO SECOND(0); 
    BEGIN 
    v_hhmm := to_dsinterval('PT9999H'); 
    RETURN v_hhmm; 
    -- 
    END hhmm_to_interval; 
BEGIN 
    v_int := hhmm_to_interval; 
end; 
/

,它不會允許直接由該函數返回的數據類型的部分指定的精度。

DECLARE 
    v_int INTERVAL DAY (4) TO SECOND(0); 
    FUNCTION hhmm_to_interval return INTERVAL DAY (4) TO SECOND IS 
    v_hhmm INTERVAL DAY (4) TO SECOND(0); 
    BEGIN 
    v_hhmm := to_dsinterval('PT9999H'); 
    RETURN v_hhmm; 
    -- 
    END hhmm_to_interval; 
BEGIN 
    v_int := hhmm_to_interval; 
end; 
/

我可以用一個亞型

DECLARE 
    subtype t_int is INTERVAL DAY (4) TO SECOND(0); 
    v_int INTERVAL DAY (4) TO SECOND(0); 
    FUNCTION hhmm_to_interval return t_int IS 
    v_hhmm INTERVAL DAY (4) TO SECOND(0); 
    BEGIN 
    v_hhmm := to_dsinterval('PT9999H'); 
    RETURN v_hhmm; 
    -- 
    END hhmm_to_interval; 
BEGIN 
    v_int := hhmm_to_interval; 
end; 
/

任何缺點亞型的方法呢?

任何替代品(例如某些地方改變默認精度)?

使用10gR2。

回答

4

沒有我能想到的實際缺陷。我認爲,如果工作變量作爲子類型的實例被分級,則會更清楚一點,例如:

DECLARE 
    subtype t_int is INTERVAL DAY (4) TO SECOND(0); 

    v_int t_int; 

    FUNCTION hhmm_to_interval return t_int IS 
    v_hhmm t_int; 
    BEGIN 
    v_hhmm := to_dsinterval('PT9999H'); 
    RETURN v_hhmm; 
    END hhmm_to_interval; 

BEGIN 
    v_int := hhmm_to_interval; 
    DBMS_OUTPUT.PUT_LINE('v_int=' || v_int); 
end; 

分享和享受。

+0

是的,代碼看起來更乾淨,只有一個地方更改精度。 – 2010-06-01 23:29:55