所以我正在尝试在groovy中执行以下存储过程
str = 'call proc("config", "insert into table (name, val) VALUES (?, ?)"'
sql.call(str, ['name', 'val'])
但是我收到以下错误:
java.sql.SQLException: Parameter index out of range (1 > number of
parameters, which is 0).
我的猜测是,因为问题标记在第二组引号内部,它不会将它们作为参数找到。
我尝试使用命名参数?.name
或:name
但没有任何效果。
要解决这个问题的任何想法吗?
答案 0 :(得分:1)
根据mysql中的documentation字符串可以双引号。
所以实际上你用2个字符串参数调用过程
call proc("string1", "whatever ? ?")
解析此查询后,mysql将返回0个输入参数,因为您明确指定了存储过程的两个参数。
因此,当数据库看不到它时,为此查询传递2个参数时会出现错误Parameter index out of range (1 > number of parameters, which is 0).
。
你可以这样做:
def parm2 = "insert into table (name, val) VALUES ('$name', '$value')"
str = 'call proc("config", ? )'
sql.call(str, [parm2])
因为您必须在'
和name
字符串中管理value
转义。
可能是SQL Injection安全问题的代码。
最好重新考虑数据库过程参数,以避免将sql查询作为参数传递。