无论条件如何,触发器始终触发

时间:2017-05-09 05:06:10

标签: 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 if;
end;

插入声明(exp_date为12-31-19):

insert into invoice(invoice_id, invoice_date, invoice_due, cc_type, cc_no,
exp_date, guest_id, reservation_id, admins_id)
values(invoice_sequence.nextval, sysdate, bill_due(100101), 'Visa', 
'4838892900203328', to_date('12-31-2019','mm/dd/yyyy'), 110, 100101, 110);

2 个答案:

答案 0 :(得分:2)

您的检查错误,而不是>=它应该是<=

:new.exp_date >= sysdate

答案 1 :(得分:0)

假设:exp_date是insert语句中的第6个参数。

鉴于to_date中的格式实际上与给定日期不匹配。

请检查:

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')

甚至更好(不要混淆世纪):

to_date('12-31-2019','mm-dd-yyyy')