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

PLSQLブロックに複数のDMLクエリがある場合、影響を受ける行の集計を計算するにはどうすればよいですか?

    一般的な手順を使用して、一般的なログテーブルにカウントを記録できます。

    ロギングテーブル

    CREATE TABLE dml_logs (
         log_id      NUMBER PRIMARY KEY,
         step        VARCHAR2(200),
         row_count   NUMBER,
         log_date    DATE
    );
    

    IDのシーケンス

    create sequence seq_dml_logs ;
    

    ロギング手順

    CREATE OR REPLACE PROCEDURE log_dml (
         p_step        VARCHAR2,
         p_row_count   NUMBER,
         p_log_date    DATE
    ) IS
         PRAGMA autonomous_transaction;
    BEGIN
         INSERT INTO dml_logs (
              log_id,
              step,
              row_count,
              log_date
         ) VALUES (
              seq_dml_logs.NEXTVAL,
              p_step,
              p_row_count,
              p_log_date
         );
         COMMIT;
    END;
    /
    

    DMLを使用したPL/SQLブロック

    DECLARE
    v_step dml_logs.step%TYPE;
    BEGIN
    
      v_step := 'cust_temp_a_update';
       UPDATE cust_temp_a SET name = 'new_val' WHERE id = 10;
    
     log_dml(v_step,SQL%ROWCOUNT,SYSDATE);
    
     v_step := 'cust_temp_b_update';
       UPDATE cust_temp_b SET name = 'new_val' WHERE id = 20;
    
     log_dml(v_step,SQL%ROWCOUNT,SYSDATE);
    END;
    /
    

    次に、集計 シンプルです。

    select SUM(row_count) FROM dml_logs 
    where step = ? and log_date = ? -- all the required conditions.
    

    レコードが特定の実行またはバッチに属していることをより適切に識別するために、dml_logsに別の列を追加できます。 batch_numberと呼ばれます 。この番号をログに記録して、dmlの一意の実行を識別し、集計の詳細を取得するためのクエリがはるかに簡単になります。




    1. MySQLにユーザー設定を保存する最良の方法は?

    2. あるテーブルの列の値を別のテーブルの列の値で更新するにはどうすればよいですか?

    3. トランザクションに含める必要のあるDDLステートメントの単体テスト

    4. MariaDBでのADDDATE()のしくみ