2012-12-05 53 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插入。