2012-12-05 13 views
6

Zaczęliśmy używać H2 w bazie danych pamięci do automatycznego testowania. Korzystamy z Oracle w naszych środowiskach produkcyjnych &. Pomysł polega więc na powieleniu struktury tabel w bazie testowej H2, tak jak w naszej bazie danych Oracle.Wyjaśnienie Oracle MERGE w bazie danych H2

Instrukcje SQL Oracle zawierają instrukcje MERGE i używają aliasu dla nazw tabel i USING w zapytaniu.

W jaki sposób mogę dynamicznie zmodyfikować to zapytanie, aby było zgodne z H2 w sposób, który nie zmienia istniejącego zapytania w środowisku deweloperów?

Przykład Oracle SQL, tak aby były kompatybilne z H2

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

(T1 & T2 alias dla tabeli)

+0

Twój projekt wybrał inny smak bazy danych, jeden z innym kursem SQL, do automatycznego testowania? Fnord. Jeśli musisz przerobić swoją aplikację, aby Twoje automatyczne testy przebiegły pomyślnie, co udowodniłeś? – APC

+2

wybieramy H2, ponieważ może on uruchomić bazę danych w pamięci, która jest bardzo szybka. – user1877775

+0

Tak, ale jeśli nie można uruchomić gramatyki SQL używanej w programach Dev i Production, nie ma znaczenia, jak szybko testy zostaną uruchomione, nie mają znaczenia. – APC

Odpowiedz

7

MERGE statement in H2 ma nieco inną, prostszą składnię:

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

Sądzę, że trzeba by napisać dwa stwierdzenia, jeden dla H2 i jeden dla Oracle. Część SELECT byłaby jednak taka sama. The Oracle MERGE statement byłaby dłuższa, wierzę, że będzie:

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

Dzięki za szybką odpowiedź. Tak więc, zgodnie z powyższą składnią, nie byłoby możliwe użycie nazwy aliasu dla zapytania w H2? – user1877775

+0

Tak, ale nie jest to nazwa aliasu. Cała składnia zdania jest inna. –

2

Standardowe wsparcie składni SQL seryjnej jest obecnie na the roadmap H2.

Jednak w niektórych uproszczonych przypadkach można użyć INSERT ... SELECT + GDZIE NIE ISTNIEJE Na przykład aby wstawić tylko wtedy, gdy rekord nie istnieje

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

Ta konstrukcja działa zarówno w Oracle, jak iw H2 (przynajmniej w MODE = Oracle), więc nie musisz mieć oddzielnych wstawek SQL do testów i prod.

Powiązane problemy