sql >> データベース >  >> RDS >> Oracle

if-elseステートメントエラーが発生しないことをトリガーします

    テーブルを手動で更新すると、トリガーは期待どおりに機能します。

    プロシージャから呼び出された場合、トリガーは無効な金額を報告せず、支払われていない場合でも全額が支払われたと表示します。支払額は他の列では変更されません。

    これは、プロシージャの更新ステートメントが次のとおりであるためです。

    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;
    

    db<>フィドル

    TO_CHAR(sysdate,'DD/MON/YYYY') 奇妙に見えます-テーブルの列は文字列ではなく日付である必要があるため、その値を文字列に変換しないでください。列が日付の場合は、クライアントのNLS設定を使用して列を元に戻します。現在の時刻を無視しようとしている場合は、TRUNC(sysdate)を実行できます。 代わりに。

    また、dbms_outputに依存しないでください。 プロシージャ本体内-これを呼び出す誰かが出力を有効にしているかどうかを制御できないため、問題が発生することはありません。トリガーで例外を発生させているので、他のエラーの手順でも同じことができます。




    1. Dataadapterを使用した更新中にDBConcurrency例外が発生しました

    2. 複数のフォームと1つの処理ページ

    3. UTF-8の代わりにwindows-1252を使用することに問題があります

    4. Sql Server 2008 R2のストアドプロシージャで文字列を検索する方法は?