通常,指定函数时,返回数据类型的比例/精度/大小未定义。
例如,您说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;
/
我可以使用SUBTYPE
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。
答案 0 :(得分: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;
分享并享受。
答案 1 :(得分:0)
Oracle为此提供了一些内置子类型,请参阅Avoiding Truncation Problems Using Date and Time Subtypes
他们是:
TIMESTAMP_UNCONSTRAINED
TIMESTAMP_TZ_UNCONSTRAINED
TIMESTAMP_LTZ_UNCONSTRAINED
YMINTERVAL_UNCONSTRAINED
DSINTERVAL_UNCONSTRAINED