15

自動テスト用に H2 インメモリ データベースの使用を開始しました。本番環境と開発環境には Oracle を使用しています。したがって、H2 test-database のテーブル構造を、Oracle dev-database と同じように複製するという考えです。

Oracle SQL ステートメントには MERGE ステートメントが含まれており、テーブル名にエイリアスを使用し、クエリで USING を使用します。

このクエリを動的に変更して、開発環境の既存のクエリを変更しないように H2 と互換性を持たせるにはどうすればよいですか?

H2互換にするOracle SQLの例

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

(T1 & T2 はテーブルのエイリアスです)

4

3 に答える 3

11

H2のMERGE ステートメントの構文は、わずかに異なり、より単純です。

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

H2 用と Oracle 用の 2 つのステートメントを作成する必要があると思います。ただし、そのSELECT部分は同じです。Oracle MERGE ステートメントは長くなりますが、次のようになると思います。

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);
于 2012-12-05T05:44:57.323 に答える
7

標準 SQL マージ構文のサポートは、現在H2のロードマップにあります。

ただし、いくつかの単純なケースでは、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 挿入を行う必要はありません。

于 2014-06-11T14:37:13.663 に答える