Oracle技术分享之MERGE语句语法检查不严格
2013-06-13 09:29
218 查看
测试发现即使在11.2中,这个问题仍然存在:
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database11gEnterprise Edition Release11.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
在MERGE的UPDATE 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行已合并。
显然在SELECT或UPDATE语句中,这样的写法是不能通过语法检查的:
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的可能性就更多了。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------------
Oracle Database11gEnterprise Edition Release11.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
在MERGE的UPDATE 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行已合并。
显然在SELECT或UPDATE语句中,这样的写法是不能通过语法检查的:
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的可能性就更多了。
oracle视频教程请关注:http://u.youku.com/user_video/id_UMzAzMjkxMjE2.html
相关文章推荐
- Hibernate之QBC--》用语法函数表示sql语句【个人感觉此技术相当之垃圾,反其正道而行】(二十七)
- oracle常用sql语句语法
- 检查Oracle 中死事务的语句
- Oracle 基本SQL语句语法
- oracle经验分享1.0 最实用的初始化库语句
- Oracle Update 语句语法与性能分析 - 多表关联
- Oracle中MERGE语句的使用
- Oracle里通过merge语句判断重复插入
- Oracle 中MERGE语句的用法(转载)
- Oracle创建表语句(Create table)语法详解及示例
- Oracle 融合语句Merge
- Oracle创建表语句(Create table) 及语法详解与示例
- 50道经典SQL语句题目及答案(使用Oracle语法)
- Ruby on Rails技术(四)——基本语法(流程控制语句)
- oracle之merge语法
- Hibernate之QBE--》用语法函数表示sql语句【个人感觉此技术相当之垃圾,反其正道而行】(二十八)
- ORACLE UPDATE 语句语法与性能分析的一点看法
- 【沙龙】2014新疆(天山论剑)首届Oracle技术分享交流沙龙-现场留念
- oracle查看表空间已分配和未分配空间的语句分享