Sql 无论条件如何,触发器总是触发

Sql 无论条件如何,触发器总是触发,sql,oracle,plsql,triggers,Sql,Oracle,Plsql,Triggers,当信用卡到期日到期时,我会触发一个异常。无论我插入什么日期,都会引发例外情况。有人知道为什么会这样吗 触发: create or replace trigger card_expired before insert or update on invoice for each row begin if :new.exp_date >= sysdate then raise_application_error(-20000,'Card is expired'); end i

当信用卡到期日到期时,我会触发一个异常。无论我插入什么日期,都会引发例外情况。有人知道为什么会这样吗

触发:

create or replace trigger card_expired
before insert or update on invoice
for each row
begin
  if :new.exp_date >= sysdate
  then
    raise_application_error(-20000,'Card is expired');
  end if;
end;
插入对账单(出口日期为19年12月31日):


假设:
exp\u date
是insert语句中的第6个参数

“截止日期”中的给定格式实际上与给定日期不匹配

请检查:

select to_char(to_date('12-31-19','mm/dd/yyyy'), 'mm-dd-yyyy') from dual;
它给出:

12-31-0019
因此,它总是小于SYSDATE

这将解决您的问题:

to_date('12-31-19','mm-dd-yy')
或者更好(不要对世纪感到困惑):


假设:
exp\u date
是insert语句中的第6个参数

“截止日期”中的给定格式实际上与给定日期不匹配

请检查:

select to_char(to_date('12-31-19','mm/dd/yyyy'), 'mm-dd-yyyy') from dual;
它给出:

12-31-0019
因此,它总是小于SYSDATE

这将解决您的问题:

to_date('12-31-19','mm-dd-yy')
或者更好(不要对世纪感到困惑):



您的支票是错误的,而不是
=
它应该是
您的支票是错误的,而不是
=
它应该是
您的插入中没有列列表。所以我们不知道你在哪里插入了什么,你的代码会引起bug。始终使用插入列表。如果你加上一个,你可能会发现你意想不到的行为消失了,所以你的年份文字没有一个世纪。19=1919还是2019?如果您的代码没有歧义,那么无论是现在还是将来,您都不太可能出现错误或意外行为。2019-12-31肯定大于SYSDATE,因此您的触发器正在工作。另一方面,日期字符串
'12-31-2019'
与模式
'mm/dd/yyyy'
不匹配。(应该是
'mm-dd-yyyy'
)。为什么要使用字符串和转换函数(
TO_DATE
),而不是直接使用日期文字(即日期“2019-31-12”
)?@ThorstenKettner-Oracle不关心日期格式中的标点符号,除非我们在掩码中使用严格的符号。但一致性是一件好事。插入中没有列列表。所以我们不知道你在哪里插入了什么,你的代码会引起bug。始终使用插入列表。如果你加上一个,你可能会发现你意想不到的行为消失了,所以你的年份文字没有一个世纪。19=1919还是2019?如果您的代码没有歧义,那么无论是现在还是将来,您都不太可能出现错误或意外行为。2019-12-31肯定大于SYSDATE,因此您的触发器正在工作。另一方面,日期字符串
'12-31-2019'
与模式
'mm/dd/yyyy'
不匹配。(应该是
'mm-dd-yyyy'
)。为什么要使用字符串和转换函数(
TO_DATE
),而不是直接使用日期文字(即日期“2019-31-12”
)?@ThorstenKettner-Oracle不关心日期格式中的标点符号,除非我们在掩码中使用严格的符号。但是一致性是一件好事。如果你跳过世纪,你应该使用
至今('12-31-19','mm-dd-rr')
@WernfriedDomscheit-如果我们使用
yy
Oracle默认为当前世纪。在这种情况下,这比
rr
更可能是正确的。但最好的解决方案是始终使用明确的四位数年份。谢谢您的评论。对于那些对格式之间的差异感到困惑的人,
yy
rr
:。但正如@APC所说的那样。我更喜欢使用明确的四位数年份。@APC,在
yy
kate8895的情况下,应该告诉我们他/她为哪家银行工作。也许我会找到一张20年的信用卡,然后我可以用它度过余生。:-)如果您跳过世纪,您应该使用
到日期('12-31-19','mm-dd-rr')
@WernfriedDomscheit-如果我们使用
yy
Oracle默认为当前世纪。在这种情况下,这比
rr
更可能是正确的。但最好的解决方案是始终使用明确的四位数年份。谢谢您的评论。对于那些对格式之间的差异感到困惑的人,
yy
rr
:。但正如@APC所说的那样。我更喜欢使用明确的四位数年份。@APC,在
yy
kate8895的情况下,应该告诉我们他/她为哪家银行工作。也许我会找到一张20年的信用卡,然后我可以用它度过余生。:-)