Пользовательские переменные, установленные параметрами

SQL я использую это:

SET @person1_id = ?;
SET @person2_id = ?;
SET @safety_factor = ?;
SELECT *
FROM table
WHERE person1 = @person1_id
AND person2 = @person2_id
AND safety_factor = @safety_factor;

Это не точный код, но показывает, что я пытаюсь сделать

То, как я тогда введите параметры

Statement stmt = connection.prepareStatement(*script*)
stmt.setLong(1, person1.id)
stmt.setLong(2, person2.id)
stmt.setBigDecimal(3, safetyFactor)

Я использую переменные в SQL, потому что значения используются в скрипте многократно, и я не хочу многократно вводить одно и то же значение в качестве разных параметров.

Это дает мне ошибку,

Исключение в потоке "main" org.h2.jdbc.JdbcSQLException: недопустимое значение "2" для параметра "parameterIndex" [90008-195]

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

2 ответа

Решение

H2 не может обработать параметризованный запрос с несколькими операторами SQL. При настройке параметра он будет выглядеть только до первой точки с запятой, а это означает, что он видит только 1 параметр, который нужно установить.

Поскольку пользовательские переменные имеют сессионную область, мы можем установить переменные в отдельном операторе.

PreparedStatement statement = connection.prepareStatement("SET @person1_id = ?")
statement.setLong(1, person1.id)
statement.execute()

PreparedStatement statement = connection.prepareStatement("SET @person2_id = ?")
statement.setLong(1, person2.id)
statement.execute()
...

Я не знаю, это поможет, но в этом случае я обычно использую другой синтаксис (для SQL Server):

declare @person1_id long
declare @person2_id long
declare @safety_factor int

SELECT @person1_id=?, @person2_id=?, @safety_factor=?

SELECT *
FROM table
WHERE person1 = @person1_id
AND person2 = @person2_id
AND safety_factor = @safety_factor;
Другие вопросы по тегам