首页 > 解决方案 > SQL 通过多个 DELETE 查询获取文件中已删除行的总数

问题描述

我举个例子

在具有一百个或更多删除查询的 SQL 脚本中,输出应如下所示: 注意:无法使用唯一的删除查询进行删除。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。已删除 1 行。提交完成。

是否可以获得删除的总行数。

1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.
1 row deleted.

16 row deleted.
Commit complete.

我也可能对更新或插入命令有效。

标签: sqloracleoracle12c

解决方案


SQL%ROWCOUNT就是想到的。但是,不幸的是,我无法使其在 SQL 级别上工作。这是一个例子:它是一个 .SQL 脚本,它设置一个变量,从两个表中删除一些行并尝试计算删除行的总数。

var total number;

delete from a where deptno = 10;
exec :total := nvl(:total, 0) + sql%rowcount;

delete from b where deptno = 10;
exec :total := nvl(:total, 0) + sql%rowcount;

print total

当我运行它时,我得到:

SQL> @p

3 rows deleted.


PL/SQL procedure successfully completed.


1 row deleted.


PL/SQL procedure successfully completed.


     TOTAL
----------

总计是NULL因为SQL%ROWCOUNTNULL(我知道;我尝试过NVL(SQL%ROWCOUNT, -1)并得到-2了结果。


DELETE但是,如果您切换到 PL/SQL(通过将您的语句包含在其中,这可能是可能的),BEGIN-END那么会有一些改进。一个新的 .SQL 脚本:

set serveroutput on
declare
  l_total number := 0;
begin
  delete from a where deptno = 10;
  l_total := l_total + sql%rowcount;

  delete from b where deptno = 10;
  l_total := l_total + sql%rowcount;

  dbms_output.put_line('Deleted total of ' || l_total || ' rows');
end;
/

测试:

SQL> @p
Deleted total of 4 rows

PL/SQL procedure successfully completed.

如果这能满足你的需求,那很好。如果没有,恐怕我不知道如何做你想做的事。


推荐阅读