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

OracleのMergeステートメントでトリガーする

    マージステートメントでソースデータがすべて混同されていると思います。挿入されている行だけを考慮したいですよね?

    あなたの引き金は次のようなものでなければならないと思います:

    CREATE OR REPLACE TRIGGER test_tri
       after INSERT
       ON test1
       FOR EACH ROW WHEN (NEW.col5 >= '01-MAY-16')
       DECLARE
       PRAGMA AUTONOMOUS_TRANSACTION;
    BEGIN
       IF INSERTING
       THEN
            MERGE INTO test_hist hist
            USING (select :new.package_id, :new.col1, :new.col2, :new.col3, :new.col4, :new.col5
                   from   dual) t1
              ON (t1.PACKAGE_ID=hist.PACKAGE_ID)
            WHEN MATCHED THEN
              UPDATE SET hist.col5=t1.col5
            WHEN NOT MATCHED THEN
              INSERT (col1, col2, col3, col4, col5)
              VALUES (t1.col1, t1.col2, t1.col3, t1.col4, t1.col5);
       END IF;  
       COMMIT;
    END;
    /
    

    N.B. :new.col5が日付列の場合、変更:

    FOR EACH ROW WHEN (NEW.col5 >= '01-MAY-16')
    

    FOR EACH ROW WHEN (NEW.col5 >= to_date('01/05/2016', 'dd/mm/yyyy'))
    

    年は4桁です(1916年ではなく2016年を意味していると思います)。




    1. CASTを使用しないVARCHARフィールドのmysqlSUM

    2. Sequel Proでは、ポート3306を介した標準のmysql接続は安全ですか?

    3. 動的にPIVOT、2つのテーブルのJOINから返された結果

    4. node.js/MySQL:データベースに挿入しようとすると、一部の文字列エンコーディング(Emoji)がエラーをスローします