Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Wie kann ich aggregierte betroffene Zeilen berechnen, wenn in meinem PLSQL-Block mehrere DML-Abfragen vorhanden sind?

Sie können die Zählungen mit einem generischen Verfahren in einer generischen Protokollierungstabelle protokollieren.

Protokollierungstabelle

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

Sequenz für ID

create sequence seq_dml_logs ;

Protokollierungsvorgang

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

PL/SQL-Block mit 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;
/

Dann Aggregation ist einfach.

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

Um besser zu erkennen, dass die Aufzeichnungen zu einem bestimmten Lauf oder einer Charge gehören, können Sie eine weitere Spalte in dml_logs hinzufügen namens batch_number . Protokollieren Sie diese Nummer, um eindeutige Läufe Ihrer DMLs zu identifizieren, und Ihre Abfrage zum Abrufen der aggregierten Details wird viel einfacher.