Оператор Oracle MERGE в базе данных H2

Мы начали использовать базу данных H2 в памяти для автоматизированного тестирования. Мы используем Oracle для наших производственных сред и сред разработки. Итак, идея состоит в том, чтобы продублировать структуру таблицы в тестовой базе данных H2, как в нашей базе данных разработки Oracle.

Операторы Oracle SQL включают операторы 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 и 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 будет такой же. оператор 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);
person Thomas Mueller    schedule 05.12.2012
comment
Спасибо за быстрый ответ. Итак, согласно приведенному выше синтаксису, означает ли это, что я не смогу использовать псевдоним для запроса в H2? - person user1877775; 05.12.2012
comment
Да, но это не псевдоним. Весь синтаксис оператора отличается. - person Thomas Mueller; 05.12.2012


Я из 2019 года. H2 поддерживает стандарт "СЛИВАТЬСЯ В... ИСПОЛЬЗУЯ... КОГДА...". Документация

person Igor Mukhin    schedule 25.10.2019