JDBC PreparedStatement игнорирует '?в блоке запросов $$ ... $$ - PullRequest
0 голосов
/ 11 июля 2019

У меня есть PreparedStatement в Java. Я предоставляю ему запрос, содержащий '?', Что-то вроде

Select .... where date >= ?

Это нормально, и когда я пытаюсь установить аргумент, используя:

preparedStatement.setObject(1, dateToSet);

работает как положено. Однако, если запрос содержит блок $$ ... $$, кажется, что вопросительный знак (внутри блока) не может быть найден, и когда я пытаюсь установить аргумент, я получаю следующую ошибку «Индекс столбца выходит за пределы диапазона: 1 , количество столбцов: 0 "

SELECT * FROM crosstab( $$ Select .... where date >= ? $$ ) AS ct (...);

Я тоже пытался поставить? сразу после блока $$ (просто чтобы убедиться), и он смог найти его (вне блока $$). Есть идеи, как сделать заполнитель аргумента обнаруживаемым в блоке $$?

1 Ответ

1 голос
/ 12 июля 2019

С $$ вы использовали строковые константы, заключенные в кавычки и ? символ, используемый для объявления параметров связывания JDBC, не будет разрешен внутри строковой константы.Согласно документации PostgreSQL:

Хотя стандартный синтаксис для указания строковых констант обычно удобен, может быть трудно понять, когда желаемая строка содержит много одинарных кавычек или обратной косой черты, поскольку каждая из них должна быть удвоена,Чтобы разрешить более удобочитаемые запросы в таких ситуациях, PostgreSQL предоставляет другой способ, называемый «цитирование в долларах», для записи строковых констант.Строковая константа, заключенная в кавычки, состоит из знака доллара ($), необязательного «тега», состоящего из нуля или более символов, другого знака доллара, произвольной последовательности символов, составляющих содержимое строки, знака доллара, того же тега, которыйНачалась эта цитата доллара и знак доллара.Например, вот два разных способа указать строку «лошадь Дианы» с использованием долларовых кавычек:

$$Dianne's horse$$
$SomeTag$Dianne's horse$SomeTag$

Поскольку crosstab() использует параметр строковой константы, вы должны самостоятельно подготовить вложенный запрос вДжава.Это обсуждалось в списке рассылки .

...