Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment puis-je calculer les lignes affectées agrégées s'il y a plusieurs requêtes DML dans mon bloc PLSQL ?

Vous pouvez consigner les comptages dans une table de journalisation générique à l'aide d'une procédure générique.

Tableau de journalisation

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

Séquence pour l'identifiant

create sequence seq_dml_logs ;

Procédure de journalisation

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;
/

Bloc PL/SQL avec DML

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;
/

Ensuite, agrégation est simple.

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

Afin de mieux identifier que les enregistrements appartiennent à une exécution ou à un lot particulier, vous pouvez ajouter une autre colonne dans le dml_logs appelé batch_number . Enregistrez ce numéro pour identifier les exécutions uniques de vos dml et votre requête pour obtenir les détails agrégés devient beaucoup plus simple.