2017-05-09 5 views
0

クレジットカードの有効期限が切れたときに例外を発生させるトリガーがあります。どんな日付を挿入しても、例外が発生します。誰がなぜこれが起こっているのか知っていますか?条件に関係なく常にトリガーが発砲しています

トリガー:

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; 

INSERT文(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); 
+0

挿入物には列リストがありません。だから、どこにあなたのコードがバグを招いているのかわからない。常に挿入リストを使用してください。あなたが1つを追加すると、予期しない動作がなくなることがあります。 –

+2

また、あなたの年のリテラルには1世紀がありません。 19 = 1919か2019ですか?コードにあいまいさがない場合は、現在または将来、バグや予期しない動作が発生する可能性は非常に低くなります。 –

+4

2019-12-31は確かにSYSDATEよりも大きいので、あなたのトリガーは働いています。 –

答えて

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

世紀をスキップした場合、 'to_date('12 -31-19 '、' mm-dd-rr ')' –

+1

@WernfriedDomscheitを使用するべきです - もし 'yy'を使うと、現在の世紀にデフォルト設定されます。この場合、 'rr'よりも正しい可能性が高くなります。しかし、最善の解決策は、明示的に4桁の年を使用することです。 – APC

+0

ご意見ありがとうございます。 'yy'と' rr'のフォーマットの違いについて混乱している人のために:[The RR Datetime Format Element](http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements004.htm#SQLRF00215 )。しかし、@ APCが言ったように、依然として。私は常に明示的に4桁の年を使用することを好みます。 – kpater87

2

あなたのチェックが、それは<=する必要があります代わりに>=で、間違っています!

:new.exp_date >= sysdate 
関連する問題