时间戳减法

时间:2013-11-06 12:12:09

标签: oracle plsql oracle10g timestamp

我收到错误

  

PL / SQL:ORA-00932:数据类型不一致:预期NUMBER到第二天的间隔

当我尝试运行此程序时。以下代码中的列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;

2 个答案:

答案 0 :(得分: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
    

答案 1 :(得分:0)

你试过了吗?

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