从多个更新查询中返回一个"记录已更新"

Log*_*arr 2 oracle

免责声明:我没有太多的SQL经验,我不知道我的公司使用的是哪个版本的Oracle.

我有一个产品价格表,明天需要更新.有数千条记录将会更新,但还有一千条记录将不会被更新.

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

如果我运行我作为脚本运行的东西,我将最终得到大约5,000"1行更新"消息,如果我看到"0行更新",则不知道哪一个失败了.

是否有某些形式的脚本我可以使用它来捕获故障,或者至少收集更新为一个总数的行数?

tbo*_*one 5

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

此外,如果使用脚本,则应将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
Run Code Online (Sandbox Code Playgroud)

从与此文件相同的目录登录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
/
Run Code Online (Sandbox Code Playgroud)

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

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