oracle - PL/SQL 函数值的间隔精度

标签 oracle plsql

通常,当您指定函数时,返回数据类型的比例/精度/大小是未定义的。

例如,您说 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。

最佳答案

没有我能想到的真正缺点。我认为如果将工作变量声明为子类型的实例会更清楚一些,例如:

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 - PL/SQL 函数值的间隔精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2947499/

相关文章:

oracle - 如何使用时间戳列执行简单的 Talend Upsert

Oracle PL/SQL 性能调优速成类

sql - PL/SQL表类型的列名

oracle - 在 BLOB 上使用 DBMS_LOB.SUBSTR 导致 ORA-06502

java - oracle INACTIVE session 正在阻塞 Activity session 需要一种方法来查找正在阻塞的 sqlid

oracle - PL/SQL 检查约束 : value on one column depends on another column

sql - 发生约束违反时如何调用触发器?

dataframe - 在 Dataframe 上查看 "iterating"的进度

oracle - SSIS - 使用 Attunity Oracle 数据源在 Oracle 查询中使用参数

c# - Oracle Entity Framework - 调用自定义函数 (EDIT_DISTANCE)