2012-09-08 138 views
2

免责声明:我没有太多的SQL经验,我不知道我公司正在使用的Oracle的版本。从多个更新查询中返回一条“记录更新”

我有明天需要更新的产品价格表。有几千条记录会被更新,但仍有一千条记录会不变。

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

如果我运行了脚本,我最终将得到一些5,000“1行更新”的消息,但如果我看到“0行更新”,则不知道哪一个失败。

是否有某种形式的脚本可以用来捕捉失败,或者至少收集更新到一个总数的行数?

回答

5

您的产品价格表是否有某种修改日期或最后修改的字段?如果是这样,请确保你正在更新这些。另外,如果使用你的脚本,你应该设置回显和后台处理日志文件。您的脚本应该是这个样子:

-- 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匿名块,并且可以与上述滑阀策略中使用。

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

+0

今天我只用你的第一个例子来进行更新,它完美地工作。另外,我们一定会在下次团队会议上提出日志表的主意。如果我们没有一个,它会很高兴。 – Logarr

+0

@记者好听。如果您想要一个简单的日志表和过程示例,请参阅http://stackoverflow.com/questions/4919437/dbms-output-put-line – tbone

相关问题