テーブルを手動で更新すると、トリガーは期待どおりに機能します。
プロシージャから呼び出された場合、トリガーは無効な金額を報告せず、支払われていない場合でも全額が支払われたと表示します。支払額は他の列では変更されません。
これは、プロシージャの更新ステートメントが次のとおりであるためです。
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
金額を更新するように指示していないため、トリガーには変更された:new
がありません。 値-古いものと新しいものは同じです。その列を更新に含める必要があります:
UPDATE Payment
SET paymenttype = PAYMENT_TYPE,
paymentdate = TO_CHAR(sysdate,'DD/MON/YYYY'),
paymentamount = amt_pay,
paymentstatus = v_paymentstatus
where paymentid = PAYMENT_ID;
TO_CHAR(sysdate,'DD/MON/YYYY')
奇妙に見えます-テーブルの列は文字列ではなく日付である必要があるため、その値を文字列に変換しないでください。列が日付の場合は、クライアントのNLS設定を使用して列を元に戻します。現在の時刻を無視しようとしている場合は、TRUNC(sysdate)
を実行できます。 代わりに。
また、dbms_output
に依存しないでください。 プロシージャ本体内-これを呼び出す誰かが出力を有効にしているかどうかを制御できないため、問題が発生することはありません。トリガーで例外を発生させているので、他のエラーの手順でも同じことができます。