2012-12-05 20 views
6

Abbiamo iniziato a utilizzare il database H2 nella memoria per i test automatici. Usiamo Oracle per gli ambienti di produzione & dev. Quindi l'idea è di duplicare la struttura della tabella nel database di test H2 come nel nostro database di sviluppo Oracle.Dichiarazione MERGE Oracle nel database H2

Le istruzioni SQL Oracle includono istruzioni MERGE e utilizzano alias per i nomi tabella e USING nella query.

Come è possibile modificare dinamicamente questa query per essere compatibile con H2 in modo da non alterare la query esistente nell'ambiente dev?

Esempio di Oracle SQL, da rendere compatibili con H2,

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

(T1 & T2 sono l'alias per la tabella)

+0

Il tuo progetto ha scelto un diverso database, uno con un diverso codice SQL, per i test automatici? Fnord. Se è necessario riscrivere l'applicazione in modo che i test automatici eseguano quali sono i test dimostrati? – APC

+2

scegliamo H2, perché può eseguire un database in memoria che è molto veloce. – user1877775

+0

Sì, ma se non è possibile eseguire la grammatica SQL che si utilizza in Dev e Production, non importa la velocità di esecuzione dei test, sono irrilevanti. – APC

risposta

7

Il MERGE statement in H2 ha una leggermente diversa, sintassi più semplice:

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

Immagino che dovresti scrivere due istruzioni, una per H2 e una per Oracle. La parte SELECT sarebbe la stessa comunque. The Oracle MERGE statement sarebbe più lungo, credo che sarebbe stato:

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

Grazie per la rapida risposta. Quindi, come per la sintassi sopra, vuol dire che non sarei in grado di usare un nome alias per la query in H2? – user1877775

+0

Sì, ma non è il nome alias. L'intera sintassi della dichiarazione è diversa. –

2

standard sostegno sintassi SQL merge è attualmente in the roadmap di H2.

Tuttavia, in alcuni casi, è possibile utilizzare semplicistiche INSERT ... SELECT + DOVE NON ESISTE Per esempio per inserire solo se il record inesistente

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

Questo costrutto funziona sia in Oracle che in H2 (almeno in MODE = Oracle), quindi non è necessario avere inserti SQL separati per test e prod.

Problemi correlati