从多个更新查询中返回一个“更新的记录”

Posted

技术标签:

【中文标题】从多个更新查询中返回一个“更新的记录”【英文标题】:Return one " records updated" from multiple update queries 【发布时间】:2012-09-08 19:43:12 【问题描述】:

免责声明:我没有太多 SQL 经验,也不知道我公司使用的是什么版本的 Oracle。

我有一个明天需要更新的产品价格表。有几千条记录将得到更新,但还有一千条记录将保持不变。

现在我对每条记录都有一个更新语句,虽然我可以将它们全部作为脚本运行,但我想获得一些关于更新了多少记录的反馈,如果可能的话,哪些语句失败了。

如果我以脚本的形式运行我所拥有的内容,我最终会收到大约 5,000 条“1 行已更新”消息,如果我看到“0 行已更新”,则不知道哪一条消息失败了。

我可以使用某种形式的脚本来捕获故障,或者至少将更新的行数收集到一个总数中吗?

【问题讨论】:

【参考方案1】:

您的产品价格表是否有某种修改日期或上次修改的字段?如果是这样,请确保您正在更新这些。

另外,如果使用您的脚本,您应该设置 echo on 并将 spool 设置为日志文件。您的脚本应该类似于:

-- updates.sql
set serveroutput on
set echo on
WHENEVER SQLERROR EXIT SQL.SQLCODE
spool on
spool updates.log

-- put updates here

commit;
spool off

从与此文件相同的目录登录到 sqlplus 并使用:@updates.sql 运行

updates.log 文件将包含运行的每条语句。

如果您想从单独的更新语句列表中获取总数,则需要在每次更新后检查 SQL%ROWCOUNT。类似(未测试):

declare 
  l_total pls_integer := 0;
begin
  update product set x = 'foo' where y='bar';
  l_total := l_total + SQL%ROWCOUNT;

  update product set x = 'blah' where y='someval';
  l_total := l_total + SQL%ROWCOUNT;

  commit;
  dbms_output.put_line(l_total);
end
/

这是一个基本的 pl/sql 匿名块,可以与上面的 spool 策略一起使用。

最后,通常设置一个基本的日志表,包含消息字段、日志日期时间、一些上下文字段(消息来自哪里等)、消息类型(日志、错误)等。处理插入日志表的过程(自治事务),然后在需要跟踪统计信息或其他任何内容时使用日志过程(dbms_output 非常有限)。您的环境可能已经有类似的东西,您只需要寻找它(或询问您公司的高级开发人员)。

【讨论】:

我今天只使用了您的第一个示例进行更新,它运行良好。另外,我一定会在下次团队会议上提出日志表的想法。如果我们还没有,那就太好了。 @Logarr 很高兴听到。如果您想要一个简单的日志表和过程示例,请参阅***.com/questions/4919437/dbms-output-put-line

以上是关于从多个更新查询中返回一个“更新的记录”的主要内容,如果未能解决你的问题,请参考以下文章

子查询返回超过 1 个值 - 使用特定日期的值更新日期范围内的记录

无法更新表中的列 它返回单行子查询返回多个

使用 IDataReader 从 SqlBulkCopy 返回记录

java获得刚刚更新的记录集的id(主键)

当要求更新未找到或未更新的记录时,应该将http返回给客户端的内容是什么?

如何在返回活动中刷新返回的 amx 页面