Как вычислить совокупные затронутые строки, если в моем блоке PLSQL есть несколько запросов DML? - PullRequest
0 голосов
/ 20 октября 2018

У меня есть сценарий, в котором может быть несколько операторов DML внутри моего блока PLSQL, я искал какой-то общий подход, с помощью которого я мог бы вычислить общее количество не затронутых строк, используя этот блок кода.

ТестДанные и структура для справки:

create table cust_temp_a
(Name varchar2(100), id varchar2(100));

insert into cust_temp_a VALUES
('Hasu','10');
insert into cust_temp_a VALUES
('Aasu','20');
insert into cust_temp_a VALUES
('Basu','30');
insert into cust_temp_a VALUES
('Casu','10');

commit;

create table cust_temp_b
(Name varchar2(100), id varchar2(100));

insert into cust_temp_b VALUES
('Hasu','10');
insert into cust_temp_b VALUES
('Aasu','20');
insert into cust_temp_b VALUES
('Basu','30');
insert into cust_temp_b VALUES
('Casu','20');

commit;

Может существовать несколько таблиц, подобных этой,

Ниже представлен блок PLSQL с возможностью регистрации количества затронутых строк:

DECLARE 
   affected_count_a number;
   affected_count_b number;
   total_affected_count number;
PROCEDURE proc(affected_count_a OUT number,affected_count_b OUT number) IS 
BEGIN 
 update cust_temp_a set name = 'new_val' where id = 10;
 affected_count_a:=sql%rowcount;

 update cust_temp_b set name = 'new_val' where id = 20;
 affected_count_b:=sql%rowcount;
END;   
BEGIN 
   proc(affected_count_a,affected_count_b);
   total_affected_count:=affected_count_a+affected_count_b;
   dbms_output.put_line('total_affected_count : ' || total_affected_count ); 
   dbms_output.put_line('affected_count_a : ' || affected_count_a);
   dbms_output.put_line('affected_count_b : ' || affected_count_b );
END;
/
commit;

Результат:

total_affected_count : 4
affected_count_a : 2
affected_count_b : 2

В процедуре "proc" может существовать несколько операторов DML, и я хотел бы применить какой-то общий подход для регистрации индивидуального количества каждого оператора DML и, наконец, совокупного значения, на которое влияет"proc".

Добавление оператора DML каждый раз и добавление соответствующей переменной к числу журналов - это боль.

1 Ответ

0 голосов
/ 20 октября 2018

Вы можете зарегистрировать счет в общей таблице журналирования, используя общую процедуру.

Таблица журналирования

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

Последовательность для идентификатора

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

PL / SQL-блок с 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;
/

Затем агрегация это просто.

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

Чтобы лучше определить, что записи принадлежат определенному прогону или пакету, вы можете добавить еще один столбец в dml_logs с именем batch_number.Зарегистрируйте этот номер, чтобы идентифицировать уникальные прогоны ваших dmls, и ваш запрос, чтобы получить сводные данные, стал намного проще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...