oracle merge 死,ORACLE MERGE指令使用注意事项

把数据从一个表复制到另一个表,插入新数据或替换掉老数据是每一个ORACLE DBA都会经常碰到的问题。在ORACLE9i以前的年代,我们要先查找是否存在老数据,如果有用UPDATE替换,否则用INSERT语句插入,其间少不了还有一些标记变量等等,繁琐的很。现在ORACLE9i专为这种情况提供了MERGE语句,使这一工作变得异常轻松,MERGE语句的语法如下:

MERGE [hint] INTO [schema .] table [t_alias] USING [schema .] { table | view | subquery } [t_alias] ON ( condition ) WHEN MATCHED THEN merge_update_clause WHEN NOT MATCHED THEN merge_insert_clause;

例如:

MERGE INTO tdest d

USING tsrc s

ON (s.srckey = d.destkey)

WHEN MATCHED THEN

UPDATE SET d.destdata = d.destdata + s.srcdata

WHEN NOT MATCHED THEN

INSERT (destkey, destdata) VALUES (srckey, srcdata)

一条语句代替了原来的一段复杂语句,但是使用MERGE也是有要注意的地方的,看下面的例子: CREATE TABLE tdest(destkey KEYTYE,destdata DATATYPE);

CREATE TABLE tsrc(srckey KEYTYE,srcdata DATATYPE); --insert some rows into tsrc here.

MERGE INTO tdest d

USING tsrc s

ON (d.destkey = s.srckey)

WHEN MATCHED THEN

UPDATE SET d.destkey = s.srckey

WHEN NOT MATCHED THEN

INSERT (d.destkey, d.destdata) VALUES (s.srckey, s.srcdata);

运行以上代码,你可能会惊讶得得到如下结果:

ORA-00904: invalid column name Cause: The column name entered is either missing or invalid. Action: Enter a valid column name.

你一开始会觉得很蹊跷,于是到处找自己哪里写错了,其实你没有写错,呵呵,是ORACLE错了。原来,其中关键是那个UPDATE语句,不能更新在ON语句中引用得那些列,这可以说是一个限制,也可以说是一个BUG,因为毕竟ORACLE的正式DOCUMENT里并没有提有这一限制。metalink里你可以找[BUG:2124282] 对这一问题的描述,可见ORACLE确实把它当成了一个BUG对待,或许,后续的版本就没有这一限制了,但是目前,如果你想从ORACLE工程师提供MERGE功能中获益的话,还是要记住这个小BUG的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值