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]
我想这与脚本被视为四个单独的语句有关,但我不知道如何单独执行它们并让变量在语句之间起作用。
答案 0 :(得分:1)
H2无法使用多个sql语句处理参数化查询。设置参数时,它只会看到第一个分号,这意味着它只能看到要设置的1个参数。
由于用户定义的变量是session scoped,我们可以在单独的语句中设置变量。
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()
...
答案 1 :(得分:0)
我不知道这会有所帮助,但在这种情况下我通常使用另一种语法(对于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;