1

我收到错误

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;
4

2 回答 2

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
    
于 2013-11-06T12:42:45.590 回答
0

你有没有尝试过:

SELECT TRUNC(SYStimestamp - EXPIRES)
  INTO vl_diff
  FROM sessions
 WHERE LOGIN_DETAILS = p_login;
于 2013-11-06T12:34:24.350 回答