今天遇到一个很诡异的问题。我在一张表中新增了一个字段。然后用如下脚本更新这个字段的值:update ibp_fund_information_tab set yield = 7.4520 where fund_code = '040003' and info_date = to_date('20081128', 'yyyymmdd');
update ibp_fund_information_tab set yield = 6.2900 where fund_code = '100025' and info_date = to_date('20081128', 'yyyymmdd');………………
update ibp_fund_information_tab set yield = 1.5000 where fund_code = 'YF0001' and info_date = to_date('20100514', 'yyyymmdd');如此六千多行。然后commit。在这同一个文件中,又继续做如下的更新操作:
UPDATE ibp_fund_information_tab f SET f.yield = 0.00 WHERE f.yield IS NULL;
COMMIT ;当这个文件执行到最后,却报了死锁的错误。报死锁错误的是这倒数第二句:
UPDATE ibp_fund_information_tab f SET f.yield = 0.00 WHERE f.yield IS NULL;百思不得其解,于是我重新来过,把新增的那个字段的值全部清空。
再把上面那个脚本分成了两个文件。第一个文件更新那六千多条,第二个文件更新剩下字段值为空的记录。
这一次,脚本没有报死锁的错误。但是又一个很诡异的现象:之前更新的六千多行中,值几乎全都变成了0。幸免的只有fund_code 不是纯数字的记录。这是为什么呢?请各位大侠指点一下,谢谢~~
update ibp_fund_information_tab set yield = 6.2900 where fund_code = '100025' and info_date = to_date('20081128', 'yyyymmdd');………………
update ibp_fund_information_tab set yield = 1.5000 where fund_code = 'YF0001' and info_date = to_date('20100514', 'yyyymmdd');如此六千多行。然后commit。在这同一个文件中,又继续做如下的更新操作:
UPDATE ibp_fund_information_tab f SET f.yield = 0.00 WHERE f.yield IS NULL;
COMMIT ;当这个文件执行到最后,却报了死锁的错误。报死锁错误的是这倒数第二句:
UPDATE ibp_fund_information_tab f SET f.yield = 0.00 WHERE f.yield IS NULL;百思不得其解,于是我重新来过,把新增的那个字段的值全部清空。
再把上面那个脚本分成了两个文件。第一个文件更新那六千多条,第二个文件更新剩下字段值为空的记录。
这一次,脚本没有报死锁的错误。但是又一个很诡异的现象:之前更新的六千多行中,值几乎全都变成了0。幸免的只有fund_code 不是纯数字的记录。这是为什么呢?请各位大侠指点一下,谢谢~~
解决方案 »
- orcle错误: 无效字符
- plsql有约束条件提示,如何查这个约束条件在哪个table上?
- 我在安装oracle9i后一切正常,能通过delphi(BDE)连接到oracle,但重新启动时报错啊19011
- oracle9i for aix下,如何配置服务?
- 有人在win2000下orcale安装时出现过这个错误吗?
- 我装完Oracle8i后,OracleOraHome81TNSListener服务启动不起来.
- 高手,如何锁表
- 请问:在用户自定义函数中能否返回多记录结果(或数据集)?如何返回记录结果?如何使用返回的记录?谢谢!
- oracle9.2.0在AIX5L上问题--急需!!
- win7安装Oracle 11g 第2版64位,遇到问题
- 100分求个SQL的语法。。
- ExtJs 中的DateField组件 不能在ie下使用 谁知道应该怎么做
update ibp_fund_information_tab set yield = 7.4520 where fund_code = '040003' and info_date = to_date('20081128', 'yyyymmdd');
commit;
UPDATE ibp_fund_information_tab f SET f.yield = 0.00 WHERE f.yield IS NULL;
COMMIT ;
希望能对你有帮助。
1。更新6k多行数据时,未全部更新。
2。fund_code列是否含有空格等其他不易发现字符。
3。是否在同一脚本变换两条update语句执行顺序,或者其结果是怎样。
len() = 0 和NULL 是两个概念
改变脚本顺序就可以了?那这个问题确实很灵异。我的做法是,如果有太多的更新语句的话,我会选择一个适当的位置来commit(太多的commit是影响性能的),不会全部commit,因为,太多的update语句同时commit可能造成死锁(不同的session同时操作这个表,其他的job、存储过程、函数同时操作这个表,都会出现死锁现象)。