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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Merge語法限制
- Laravel ORM SQL 語句查詢、檢視,附贈 IDE ORM 語法提示LaravelORMSQLIDE
- 檢視 Laravel 查詢資料語句Laravel
- SQL 高階語法 MERGE INTOSQL
- CSS語法檢查利器之csslintCSS
- python基礎語法—語句Python
- Sqlserver的merge into或delete語句堵塞select語句,鎖型別是LCK_M_ISSQLServerdelete型別
- mysql查詢語句MySql
- 前端工程化之路-語法檢查前端
- orcale 語句基本語法縮寫
- MogDB/openGauss中merge的語法解析
- ORACLE 資料庫 查詢語句與DML語句Oracle資料庫
- C#中檢查null的語法糖C#Null
- Mysql之查詢語句MySql
- SQL mother查詢語句SQL
- sql查詢語句流程SQL
- SQL查詢語句 (Oracle)SQLOracle
- mysql查詢語句集MySql
- flask之控制語句 if 語句與for語句Flask
- 使用sql語句查詢平均值,使用sql語句查詢資料總條數, not in 篩選語句的使用SQL
- oracle檢視物件DDL語句Oracle物件
- MySQL檢視建表語句MySql
- SAPGUI裡實現自定義的語法檢查GUI
- mysql高階查詢語句MySql
- 多表查詢建表語句
- Laravel 子查詢語句用法Laravel
- 資料庫查詢語句資料庫
- GaussDB SQL基礎語法示例-迴圈語句SQL
- 必知必會——SQL語句基本語法整理SQL
- 使用 C# 9.0 新語法提升 if 語句美感C#
- 資料庫的檢索語句資料庫
- mysql查詢語句5:連線查詢MySql
- mysql實現merge功能之DUPLICATE key UPDATE語法MySql
- 6.4. PL/SQL語法——6.4.5. 迴圈語句SQL
- Java面試需要知道的SQL語句語法Java面試SQL
- sql 語句網路除錯和 sql 語句低層傳輸檢視SQL除錯
- postgresql dba常用sql查詢語句SQL
- MySQL內連線查詢語句MySql
- ORACLE結構化查詢語句Oracle