2012-12-05 127 views
6

我們開始在內存數據庫中使用H2來進行自動化測試。我們將Oracle用於我們的生產&開發環境。所以我們的想法是複製H2 test-database中的表結構,就像它在Oracle開發數據庫中一樣。H2數據庫中的Oracle MERGE語句

Oracle SQL語句包含MERGE語句並在查詢中使用表名和USING的別名。

如何動態修改此查詢以便與H2兼容,而不會改變開發環境中的現有查詢?在Oracle SQL的

實施例中,待由兼容H2,

MERGE INTO TABLE T1 
USING (SELECT .... 
     ........... 
     FROM DUAL) T2 

(T1 & T2是該表的別名)

+0

您的項目選擇了一種不同的數據庫風格,一個具有不同的SQL drammar,用於自動化測試? Fnord。如果您必須重新編寫應用程序,以便您的自動化測試運行您的測試所證明的內容? – APC

+2

我們選擇H2,因爲它可以運行非常快的內存數據庫。 – user1877775

+0

是的,但是如果它不能運行你在開發和生產中使用的SQL語法,那麼測試的運行速度並不重要,它們是無關緊要的。 – APC

回答

7

MERGE statement in H2有一個稍微不同,簡單的語法:

MERGE INTO TEST(ID, NAME) KEY(ID) 
SELECT 1, 'Hello' FROM DUAL 

我想你將不得不寫兩條語句,一條用於H2,一條用於Oracle。然而,SELECT部分將是相同的。 The Oracle MERGE statement會更長,我相信這將是:目前

MERGE INTO TEST T 
USING (SELECT 1 ID, 'Hello' NAME FROM DUAL) D 
ON (T.ID = D.ID) 
WHEN MATCHED THEN 
UPDATE SET T.NAME = D.NAME 
WHEN NOT MATCHED THEN 
INSERT (B.ID, B.NAME) VALUES (D.ID, D.NAME); 
+0

感謝您的快速響應。所以,根據上面的語法,這是否意味着我不能在H2中使用別名進行查詢? – user1877775

+0

是的,但它不是別名。聲明的全部語法是不同的。 –

2

標準SQL合併語法的支持是對H2的the roadmap

然而,在一些簡單的情況下,你可以使用INSERT ... SELECT + WHERE NOT EXISTS 例如,如果只插入記錄不存在

INSERT INTO T1(K1, V2, V3) 
SELECT 1, 2, 3 FROM DUAL 
    WHERE NOT EXISTS (SELECT 1 FROM T1 WHERE 
K1 = 1 AND V2 = 2 AND V3 = 3); 

此構思在Oracle和H2(至少在MODE = Oracle)中都可以工作,所以您不必爲測試和產品分別提供單獨的SQL插入。