MERGE語句語法檢查不嚴格

yangtingkun發表於2010-06-11

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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章