Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como posso calcular as linhas afetadas agregadas se houver várias consultas DML no meu bloco PLSQL?


Você pode registrar as contagens em uma tabela de registro genérica usando um procedimento genérico.

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

Sequência para ID
create sequence seq_dml_logs ;

Procedimento de registro
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;
/

Bloco PL/SQL com 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;
/

Em seguida, agregação é simples.
select SUM(row_count) FROM dml_logs 
where step = ? and log_date = ? -- all the required conditions.

Para identificar melhor que os registros pertencem a uma determinada execução ou lote, você pode adicionar outra coluna no dml_logs chamado batch_number . Registre esse número para identificar execuções exclusivas de seus dmls e sua consulta para obter os detalhes agregados se torne muito mais simples.