MERGE语句语法检查不严格

ITPUB上看到了一个有意思的bugOracleMERGE语法检查不严格,简单记录一下这个问题。

原贴见:http://www.itpub.net/thread-1313319-1-4.html

 

 

 

测试发现即使在11.2中,这个问题仍然存在:

SQL> SELECT * FROM V$VERSION;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

SQL> CREATE TABLE T1
  2  (ID NUMBER,
  3  NAME VARCHAR2(30));

表已创建。

SQL> CREATE TABLE T2
  2  (ID NUMBER,
  3  NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO T1 VALUES (1, 'A');

已创建 1 行。

SQL> INSERT INTO T1 VALUES (2, 'A');

已创建 1 行。

SQL> INSERT INTO T2 VALUES (1, 'B');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> MERGE INTO T2
  2  USING (SELECT ID, NAME FROM T1) T1
  3  ON (T1.ID = T2.ID)
  4  WHEN MATCHED THEN UPDATE
  5  SET T2.NAME = T2.T1.NAME
  6  WHEN NOT MATCHED THEN INSERT
  7  VALUES (T1.ID, T1.NAME);

2 行已合并。

SQL> SELECT * FROM T2;

        ID NAME
---------- ------------------------------
         1 A
         2 A

MERGEUPDATE SET语法中,T2.T1.NAME这种错误的写法也被接收,而T2这个前缀被忽略。这里如果不是T2换成其他任意的字符也不会导致错误:

SQL> MERGE INTO T2
  2  USING (SELECT ID, NAME FROM T1) T1
  3  ON (T1.ID = T2.ID)
  4  WHEN MATCHED THEN UPDATE
  5  SET T2.NAME = BDW.T1.NAME
  6  WHEN NOT MATCHED THEN INSERT
  7  VALUES (T1.ID, T1.NAME);

2 行已合并。

SQL> MERGE INTO T2
  2  USING (SELECT ID, NAME FROM T1) T1
  3  ON (T1.ID = T2.ID)
  4  WHEN MATCHED THEN UPDATE
  5  SET T2.NAME = SYS.T1.NAME
  6  WHEN NOT MATCHED THEN INSERT
  7  VALUES (T1.ID, T1.NAME);

2 行已合并。

显然在SELECTUPDATE语句中,这样的写法是不能通过语法检查的:

SQL> SELECT T2.T1.NAME
  2  FROM T1, T2
  3  WHERE T1.ID = T2.ID;
SELECT T2.T1.NAME
       *
1 行出现错误:
ORA-00904: "T2"."T1"."NAME":
标识符无效


SQL> UPDATE T2
  2  SET NAME =
  3   (
  4   SELECT T2.T1.NAME
  5     FROM T1
  6     WHERE T1.ID = T2.ID
  7  );
        SELECT T2.T1.NAME
               *
4 行出现错误:
ORA-00904: "T2"."T1"."NAME":
标识符无效

越是新特性bug就越多,虽然MERGE语法在9i就出现了,但是相比较还是用的比较少,用的人少了,所经历的各种极端的测试就少,隐藏bug的可能性就更多了。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/4227/viewspace-665076/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/4227/viewspace-665076/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值