Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如果我的PLSQL块中有多个DML查询,如何计算受聚合影响的行?_Sql_Oracle_Plsql_Oracle11g - Fatal编程技术网

如果我的PLSQL块中有多个DML查询,如何计算受聚合影响的行?

如果我的PLSQL块中有多个DML查询,如何计算受聚合影响的行?,sql,oracle,plsql,oracle11g,Sql,Oracle,Plsql,Oracle11g,我有一个场景,在我的PLSQL块中可能存在多个DML语句,我正在寻找一些通用方法,通过使用该方法,我可以计算使用此代码块受影响的行总数 供参考的试验数据和结构: 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

我有一个场景,在我的PLSQL块中可能存在多个DML语句,我正在寻找一些通用方法,通过使用该方法,我可以计算使用此代码块受影响的行总数

供参考的试验数据和结构:

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语句并将相应的变量添加到日志计数是一件痛苦的事情。

您可以使用通用过程将计数记录到通用日志记录表中

记录表

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;
/
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;
/
带有DML的PL/SQL块

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;
/
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\U日志中添加另一列,称为
batch\U number
。记录此数字,以确定DML的唯一运行,并使您的查询更简单。

非常感谢,我只是在寻找类似的方法,我将尝试从这里执行更多的实验。