今天给客户批量更新数据,由于是oracle数据库,oracle的多表更新语法和 sql server/sybase的语法不一样,
于是就把几年前搜来的oracle多表更新语法copy了过来
Oracel 示例:
update landleveldata a
set (a.gqdltks, a.bztks)=
(select b.gqdltks, b.bztks from gdqlpj b
where a.GEO_Code=b.lxqdm)
改好后
update lswlzd a
set a.lswlzd_wlmc=
(select b.newmc from kgcwltz081120 b
where a.lswlzd_wlbh=b.wlbh)
,在pl/sql中一执行,结果,报错误ora-01407,无法更新lc0349999.lswlzd.lswlzd_wlmc为null,
一开始我以为,kgcwltz081120 这个对照表有问题,结果,检查了一下,没有为null 的,后来,搜了一下网上的资料,发现是多表更新语法写的有问题, 以上语法是 是将 表 lswlzd 中 lswlz d_wlmc 列 的值全部更新,更新的值为: select b.newmc from kgcwltz081120 b where a.lswlzd_wlbh=b.wlbh (没有对应上的更新为null.)
这也就是那个ora-01407错误的来历。
正确的oracle多表更新的语法为:
update lswlzd a
set a.lswlzd_wlmc=
(select b.newmc from kgcwltz081120 b
where a.lswlzd_wlbh=b.wlbh)
where exists
(select 1
from kgcwltz081120 b
where a.lswlzd_wlbh=b.wlbh)
下边的语句是建立KGCWLTZ081120 这个对照表的语句:
CREATE TABLE LC0349999.KGCWLTZ081120
(
WLBH VARCHAR2(30) NOT NULL,
OLDMC VARCHAR2(200) NOT NULL,
NEWMC VARCHAR2(200) NOT NULL
)