2012-12-05 17 views
6

Otomatik sınama için H2 bellek veritabanında kullanmaya başladık. Üretimimizi & dev çevrimlerimiz için Oracle kullanıyoruz. Bu nedenle fikir, Oracle dev veritabanında olduğu gibi H2 yapısı veritabanındaki tablo yapısını kopyalamaktır.Oracle veritabanında H2 deyiminde MERGE ifadesi

Oracle SQL deyimleri, MERGE deyimlerini içerir ve tablo adları için diğer adı ve sorguda KULLANIMI kullanır.

Bu sorguyu, dinamik olarak, dev ortamındaki varolan sorguyu değiştirmeyecek şekilde H2 ile uyumlu olacak şekilde nasıl değiştirebilirim? Oracle SQL

örneği

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

MERGE statement in H2 biraz daha farklı bir basit sözdizimine sahip

+0

Projeniz, otomatik test için farklı bir SQL drammarı olan farklı bir veritabanı çeşidi seçti? Fnord. Uygulamanızı yeniden yazmanız gerekiyorsa, otomatik testleriniz çalışırsa testleriniz neyin kanıtlandığını gösterir? – APC

+2

biz H2'yi seçiyoruz çünkü çok hızlı bir bellek içi veritabanı çalıştırabilir. – user1877775

+0

Evet, ancak Dev ve Prodüksiyon'da kullandığınız SQL dilbilgisini çalıştıramazsa, testlerin ne kadar hızlı yürüdüğü önemli değildir, bunlar önemsizdir. – APC

cevap

7

(T1 & T2 tablosu için takma olan), H2 ile uyumlu yapılacak:

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

Sanırım iki ifade yazmalısınız, biri H2 için, diğeri Oracle için. Ancak SELECT kısmı aynı olurdu. The Oracle MERGE statement uzun olur, öyle olacağını düşünüyoruz:

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

Hızlı yanıt için teşekkürler. Yani, yukarıdaki sözdizimine göre bu, H2 sorgusu için bir takma ad kullanamayacağım anlamına mı geliyor? – user1877775

+0

Evet, ancak takma ad değil. İfadenin bütün sözdizimi farklıdır. –

2

Standart SQL birleştirme sözdizimi destek H2 the roadmap üzerinde şu anda.

Ancak, INSERT kullanabileceğiniz bazı basit durumlarda ... SEÇ + DEĞİL yalnızca eklemek için Örneğin MEVCUT NEREDE kayıt yok

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); 

Bu yapı hem Oracle'da hem de H2'de (en azından MODE = Oracle) çalışabilmeniz için, testler ve ürünler için ayrı SQL eklerine sahip olmanız gerekmez.