【问题标题】:User-defined variables set by parameters参数设置的用户自定义变量
【发布时间】:2017-07-23 09:03:12
【问题描述】:

正在使用的 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 中使用变量,因为这些值在整个脚本中重复使用,我不想多次输入相同的值作为不同的参数。

这给了我一个错误,

线程“主”org.h2.jdbc.JdbcSQLException 中的异常:无效值 “2”代表参数“parameterIndex”[90008-195]

我想这是因为脚本被视为四个单独的语句,但我不知道如何分别执行它们并使变量在语句之间起作用。

【问题讨论】:

  • 什么是“stmt”。我从你的错误信息中猜测问题是 stmt 有一个数组,它没有用正确数量的元素初始化。
  • 更新解释什么是 stmt。没有使用数组,唯一的参数是上面示例 sql 中显示的参数
  • 我在这里猜测问题出在 prepareStatement(script) 内部。您的 sql 的第一行(在第一个“;”之前)仅包含一个参数。因此,我想这只允许您随后添加一个参数。你需要你的第一个 sql 语句来使用所有三个参数。
  • 你能不使用临时表,让你的第一条语句为 INSERT INTO tmpTable VALUES(x, y, z),然后从那里访问变量吗?最好还是创建一个存储过程,特别是如果您有多个语句要执行。
  • 为什么不直接省略前三行,而将SELECT * FROM table WHERE person1 = ? AND person2 = ? AND safety_factor = ?; 用于SQL?

标签: java sql jdbc h2


【解决方案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()
...

【讨论】:

    【解决方案2】:

    我不知道这会有所帮助,但在这种情况下,我通常使用另一种语法(用于 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;
    

    【讨论】:

    • 遗憾的是,H2 没有任何类似于“declare”的东西,而且我看不到将这种语法转换为有效 H2 SQL 的方法
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-08
    相关资源
    最近更新 更多