通常,當您指定函數時,返回數據類型的scale/precision/size是未定義的。PL/SQL的間隔精度函數值
例如,你說FUNCTION show_price RETURN NUMBER
或FUNCTION 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。
是的,代碼看起來更乾淨,只有一個地方更改精度。 – 2010-06-01 23:29:55