Массивы SQL как параметры для подготовленных операторов - переносимость - PullRequest
1 голос
/ 04 июня 2011

Я работаю с PostgreSQL для моих производственных машин, H2 - для создания модульных тестов на уровне DAO и Java / JDBC - для уровня приложений.

Я хотел бы использовать массивы SQL для реализации массовых запросов к моей базе данных. Однако синтаксис, ожидаемый двумя базами данных, кажется разным! В Postgres это

SELECT * FROM mytable WHERE id=ANY(?)

В H2 это

SELECT * FROM TABLE(id CHARACTER VARYING=?) NATURAL JOIN mytable

Я думал, что SQL должен был быть стандартизирован! Я решил пойти читать фактический стандарт, но, видимо, вы должны заплатить деньги за это ... Смешно!

Мне не хватает другого способа переноса между базами данных?

Ответы [ 2 ]

1 голос
/ 04 июня 2011

Стандартизированная?Переносимость между базами данных?Ха!Вы сделали смешно.Я сталкивался только с массивами с PostgreSQL, но Стивен указывает, что они в SQL99;Я не знаю, какой синтаксис является стандартным (я бы предположил, что PostgreSQL, как правило, хорошо справляется с этими задачами), но IN-запрос должен работать практически везде:

select * from mytable where id in (?)

Вы быиспользуйте разделенный запятыми список значений id в заполнителе, и вам придется следить за размером списка id s (и этот размер, конечно, будет зависеть от базы данных).

0 голосов
/ 04 июня 2011

Существуют определенные стандарты, которые согласуются между системами баз данных. Во многих случаях это базовая линия для реализации. Затем каждая отдельная система строит эти стандарты по-своему.

Абсолютно страшно даже думать о том, чтобы пытаться придумать что-то совместимое во всех системах. Лучший способ сделать это - убедиться, что вы ограничиваете то, что делаете, тем, что указано в этих стандартах. Ничего более. Если вы выйдете за рамки этого, например, с помощью агрегатных функций, вы будете самостоятельно.

Несколько недель назад я подумал, что попробую внедрить систему, в которой я использовал PostgreSQL в dev / test и SQLite для своих модульных тестов. Я думал, что наличие базы данных SQLite в памяти поможет мне ускорить интеграционные тесты. Хотя эта часть была правдой, несоответствие в функциональности между PostgreSQL и SQLite вызвало ряд головных болей. Пройдя через несколько разных вещей (я тоже использовал NHibernate), я сдался и оставил эту мысль.

Мораль этой истории? Портативность / стандартизация мало что значат. Будьте последовательны в том, что вы используете во всем, что вы делаете. Вы спасете себя от горя.

...