MERGE語句語法檢查不嚴格
在ITPUB上看到了一個有意思的bug,Oracle的MERGE語法檢查不嚴格,簡單記錄一下這個問題。
原貼見: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
在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的可能性就更多了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-665076/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch查詢語句語法Elasticsearch
- Oracle對於啟動引數檢查不嚴格Oracle
- Merge語法限制
- Oracle Merge語法Oracle
- Laravel ORM SQL 語句查詢、檢視,附贈 IDE ORM 語法提示LaravelORMSQLIDE
- oracle中merge 語句使用Oracle
- Oracle merge into delete語法Oracledelete
- 檢視 Laravel 查詢資料語句Laravel
- SQL語句執行進度檢查SQL
- 常用的檢查SQL Agent Job 語句SQL
- 【SQL Server學習筆記】Delete 語句、Output 子句、Merge語句SQLServer筆記delete
- mysql實現merge into語法MySql
- 使用SQL MERGE語句組合表SQL
- 前端工程化之路-語法檢查前端
- CSS語法檢查利器之csslintCSS
- 用SQL語句檢查CPU和磁碟空間SQL
- python基礎語法—語句Python
- orcale 語句基本語法縮寫
- Oracle sql with 語句語法與例子OracleSQL
- JS的語句及語法(轉)JS
- Hql查詢語句
- mysql查詢語句MySql
- oracle之merge語法(轉載)Oracle
- 用merge 語句代替 insert 和deletedelete
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- ORACLE UPDATE 語句語法與效能分析Oracle
- merge語句導致的ORA錯誤分析
- mysql查詢語句集MySql
- SQL查詢語句 (Oracle)SQLOracle
- MySQL查詢阻塞語句MySql
- SQL server 查詢語句SQLServer
- Hibernate 查詢語句
- oracle查詢語句大全Oracle
- SQL mother查詢語句SQL
- Mysql之查詢語句MySql
- Sqlserver的merge into或delete語句堵塞select語句,鎖型別是LCK_M_ISSQLServerdelete型別
- 常用的DUMP語句ORADEBUG語法
- SAPGUI裡實現自定義的語法檢查GUI