Пользовательские переменные, установленные параметрами
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;