我收到错误
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;
答案 0 :(得分:1)
当您从另一个时间戳数据类型中减去一个时间戳数据类型的值(也是时间戳数据类型)时,该减法的结果将是间隔数据类型,而不是时间戳,因此当您尝试选择/分配时间戳时将间隔数据类型的值输入/添加到时间戳数据类型的变量中,您将不可避免地收到PL/SQL: ORA-00932:
/ PLS-00382
错误消息。一个简单的解决方案是将时间戳减法的结果分配给区间数据类型的变量。为此你:
将您的vl_diff
变量重新声明为区间数据类型的变量:
vl_diff interval day to second;
使用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;