PL / SQL函数值的间隔精度

通常,当你指定一个函数时,返回数据类型的scale / precision / size是未定义的。

例如,您说FUNCTION show_price RETURN NUMBERFUNCTION show_name RETURN VARCHAR2

您不允许使用FUNCTION show_price RETURN NUMBER(10,2)FUNCTION show_name RETURN VARCHAR2(20) ,并且函数返回值不受限制。 这是文档化的功能。

现在,如果我将9999小时(大约400天)推入以下内容,则会出现精度错误(ORA-01873)。 限制是因为默认的天数精度是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。


没有我能想到的真正的缺点。 我认为,如果工作变量作为子类型的实例被减少,那将会更加清楚,例如:

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; 

分享并享受。


Oracle为此提供了一些内置子类型,请参阅使用日期和时间子类型避免截断问题

他们是:

TIMESTAMP_UNCONSTRAINED
TIMESTAMP_TZ_UNCONSTRAINED
TIMESTAMP_LTZ_UNCONSTRAINED
YMINTERVAL_UNCONSTRAINED
DSINTERVAL_UNCONSTRAINED
链接地址: http://www.djcxy.com/p/46121.html

上一篇: Precision of Interval for PL/SQL Function value

下一篇: Inline horizontal spacer in HTML