SQL 通过多个 DELETE 查询获取文件中已删除行的总数

Posted

技术标签:

【中文标题】SQL 通过多个 DELETE 查询获取文件中已删除行的总数【英文标题】:SQL Obtain total amount of deleted lines in file with multiple DELETE queries 【发布时间】:2020-04-30 07:34:15 【问题描述】:

我举个例子

在具有一百个或更多删除查询的 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.

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

【问题讨论】:

您所说的输出不是来自数据库。它来自一些连接到数据库并在屏幕上显示结果的“客户端”程序。人们经常忘记这个基本且非常重要的事实。您在使用 SQLPlus 吗?如果是这样,那么答案很简单:SQLPlus 有一个命令列表,没有命令可以得到你想要的。另一方面,SQLPlus 和其他客户端程序可以显示DBMS_OUTPUT 缓冲区的内容。 Littlefoot 的回答展示了如何使用 PL/SQL 写入该缓冲区。 【参考方案1】:

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


但是,如果您切换到 PL/SQL - 这可能通过将您的 DELETE 语句包含在 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.

如果这能满足您的需求,很好。如果没有,恐怕我不知道该怎么做。

【讨论】:

看起来不错。现在我无法测试解决方案,但非常感谢您的回答。

以上是关于SQL 通过多个 DELETE 查询获取文件中已删除行的总数的主要内容,如果未能解决你的问题,请参考以下文章

AS400多成员文件SQL查询

如何通过sql查询获取文件的文件扩展名?

通过 SQL 查询获取特定数据库的所有表名?

SQL 查询 - 多个日期范围

通过一个 SQL 查询从多个类别中检索最常见的项目名称及其最高价格

EF框架另一个 SqlParameterCollection 中已包含 SqlParameter。