Изявление на Oracle MERGE в H2 база данни

Започнахме да използваме базата данни H2 в паметта за автоматизирано тестване. Използваме Oracle за нашите среди за производство и разработка. Така че идеята е да се дублира структурата на таблицата в H2 тестовата база данни, както е в нашата Oracle dev-база данни.

SQL операторите на Oracle включват оператори MERGE и използват псевдоним за имена на таблици и USING в заявката.

Как мога да модифицирам тази заявка динамично, за да бъде съвместима с H2 по начин, който не променя съществуващата заявка в средата за разработка?

Пример за Oracle SQL, който трябва да бъде направен съвместим с H2,

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

(T1 и T2 са псевдонимите на таблицата)


person user1877775    schedule 05.12.2012    source източник
comment
Вашият проект е избрал различен вариант на база данни, една с различна SQL драма, за автоматизирано тестване? Фнорд. Ако трябва да пренапишете приложението си, така че вашите автоматизирани тестове да се изпълняват, какво са доказали вашите тестове?   -  person APC    schedule 05.12.2012
comment
избираме H2, защото може да изпълнява база данни в паметта, което е много бързо.   -  person user1877775    schedule 05.12.2012
comment
Да, но ако не може да изпълнява SQL граматиката, която използвате в Dev and Production, няма значение колко бързо се изпълняват тестовете, те са без значение.   -  person APC    schedule 06.12.2012
comment
Не виждам смисъл защо този въпрос е отрицателен - това Е характеристиката на H2 да емулира синтаксиса на израза на Oracle ('MODE=Oracle') и Е обичайна и добра практика в индустрията да се изпълняват бързи интеграционни тестове на бази данни в паметта.   -  person Boris Treukhov    schedule 11.06.2014


Отговори (3)


Изявлението MERGE в H2 има малко по-различен, по-прост синтаксис:

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

Предполагам, че ще трябва да напишете два отчета, един за H2 и един за Oracle. Частта SELECT обаче ще бъде същата. Изявлението MERGE на Oracle би било по-дълго, вярвам, че би било:

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);
person Thomas Mueller    schedule 05.12.2012
comment
Благодаря за бързата реакция. И така, според синтаксиса по-горе означава ли това, че няма да мога да използвам псевдоним за заявката в H2? - person user1877775; 05.12.2012
comment
Да, но това не е псевдонимът. Целият синтаксис на израза е различен. - person Thomas Mueller; 05.12.2012

Поддръжката на стандартен 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 вмъквания за тестове и продукция.

person Boris Treukhov    schedule 11.06.2014

Аз съм от 2019 г. H2 поддържа стандарт "ОБЛИВАНЕ В ... ИЗПОЛЗВАНЕ ... КОГАТО ...". Документация

person Igor Mukhin    schedule 25.10.2019