【问题标题】:Timestamp subtraction时间戳减法
【发布时间】:2013-11-17 16:10:49
【问题描述】:

我收到了错误

PL/SQL:ORA-00932:不一致的数据类型:预期的 NUMBER 得到 INTERVAL DAY TO SECOND

当我尝试运行此程序时。下面代码中的列EXPIRES 是SESSIONS 表中的TIMESTAMP(6) 类型。就代码而言,我有两个一致的数据类型被相互减去。那么为什么会出现这个错误呢?

CREATE OR REPLACE PROCEDURE demo_restrict_multlogin (p_login       varchar2,
                                                     p_out     OUT NUMBER,
                                                     p_msg     OUT VARCHAR2)
IS
   vl_val    NUMBER;
   vl_diff  TIMESTAMP(6);
BEGIN
   p_out := 0;

   SELECT   SYStimestamp-EXPIRES
     INTO   vl_diff
     FROM   sessions
    WHERE   LOGIN_DETAILS = p_login;


   SELECT   CASE WHEN COUNT (1) > 0 THEN 1 ELSE 2 END
     INTO   vl_val
     FROM   sessions
    WHERE   LOGIN_DETAILS = p_login AND TO_CHAR (vl_diff, 'mi') > 30;

   IF vl_val = 1
   THEN
      p_msg := 'Pass expired';
   ELSE
      p_msg := 'Pass not expired ';
   END IF;
EXCEPTION
   WHEN OTHERS
   THEN
      p_out := 1;
END;

【问题讨论】:

    标签: oracle plsql oracle10g timestamp


    【解决方案1】:

    当您从另一个也是时间戳数据类型的值中减去一个时间戳数据类型的值时,该减法的结果将是间隔数据类型,而不是时间戳,因此当您尝试选择/分配一个将间隔数据类型的值插入/转换为时间戳数据类型的变量,您将不可避免地收到PL/SQL: ORA-00932:/PLS-00382 错误消息。一个简单的解决方案是将时间戳减法的结果分配给区间数据类型的变量。为此,您:

    1. 将你的vl_diff变量重新声明为区间数据类型的变量:

      vl_diff interval day to second;
      
    2. 使用extract() 函数从分配给vl_diff 变量的值中提取分钟数:

      extract(minute from vl_diff)
      

      您的第二个查询可能如下所示:

      select case when count(1) > 0 then 1 else 2 end
        into vl_val
        from sessions
       where login_details = p_login 
         and extract(minute from vl_diff) > 30
      

    【讨论】:

    • 不是extract(vl_diff from l_interval) 你的意思是extract(minute from vl_diff) ..ryt ?
    • 我在 10g 中工作。提取不工作。我猜它不支持提取功能
    • @kushal EXTRACT 在 10g 中可用
    • 我不知道,但无论如何我都无法使用它。
    【解决方案2】:

    你试过了吗:

    SELECT TRUNC(SYStimestamp - EXPIRES)
      INTO vl_diff
      FROM sessions
     WHERE LOGIN_DETAILS = p_login;
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-03
    • 2021-12-29
    • 2011-04-02
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    • 2012-05-22
    相关资源
    最近更新 更多