2012-12-05 2 views
6

Wir begannen, die H2 in der Speicherdatenbank für automatisierte Tests zu verwenden. Wir verwenden Oracle für unsere Produktion & Entwicklungsumgebungen. Die Idee besteht also darin, die Tabellenstruktur in der H2-Testdatenbank zu duplizieren, so wie es in unserer Oracle-Entwicklerdatenbank der Fall ist.Oracle MERGE-Anweisung in H2-Datenbank

Die Oracle SQL-Anweisungen enthalten MERGE-Anweisungen und verwenden Aliasnamen für Tabellennamen und USING in der Abfrage.

Wie kann ich diese Abfrage dynamisch so ändern, dass sie mit H2 so kompatibel ist, dass die vorhandene Abfrage in der Entwicklungsumgebung nicht geändert wird?

Beispiel der Oracle SQL, um mit H2 kompatibel gemacht werden,

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

(T1 & T2 sind die Alias ​​für die Tabelle)

+0

Ihr Projekt hat eine andere Art von Datenbank gewählt, eine mit einem anderen SQL-Drammar, für automatisiertes Testen? Fnord. Wenn Sie Ihre Anwendung neu schreiben müssen, damit Ihre automatisierten Tests laufen, was haben Ihre Tests bewiesen? – APC

+2

wir wählen H2, weil es eine In-Memory-Datenbank ausführen kann, die sehr schnell ist. – user1877775

+0

Ja, aber wenn es nicht die SQL-Grammatik ausführen kann, die Sie in Dev und Production verwenden, spielt es keine Rolle, wie schnell die Tests laufen, sie sind irrelevant. – APC

Antwort

7

Die MERGE statement in H2 hat eine etwas andere, einfachere Syntax:

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

Ich denke, Sie müssten zwei Anweisungen schreiben, eine für H2 und eine für Oracle. Der SELECT Teil wäre jedoch der gleiche. The Oracle MERGE statement wäre mehr, ich glaube, es wäre:

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

Danke für die schnelle Antwort. Also, nach der obigen Syntax bedeutet das, ich wäre nicht in der Lage, einen Alias-Namen für die Abfrage in H2 zu verwenden? – user1877775

+0

Ja, aber es ist nicht der Aliasname. Die ganze Syntax der Anweisung ist anders. –

2

Standard-SQL-Merge-Syntax-Unterstützung wird derzeit auf the roadmap von H2.

jedoch in einigen Fällen verein Sie INSERT verwenden können ... SELECT + WHERE EXISTS NICHT Zum Beispiel nur einfügen, wenn die Datensatz existiert nicht

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

Diese Konstruktion funktioniert sowohl in Oracle als auch in H2 (zumindest in MODE = Oracle), so dass Sie keine separaten SQL-Einfügungen für Tests und Prod. benötigen.