为了比上面@mtk 的答案更明确,请尝试更改:
sql.call("{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
到:
sql.call(GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}"){}
您的第一次尝试将不起作用-这是尝试绑定过程的名称,它将生成以下形式的 SQL:
{ call ?.NAME_PROCEDURE(?,?,?) }
第二个稍微不那么明显。Groovy SQL 使用 GString 对象来生成 SQL 和绑定列表。但是,因为您从原始字符串开始,表达式的结果将是原始字符串,所以传递给 sql.call 的内容如下所示:
{ call schema.NAME_PROCEDURE(par1,par2,par2) }
不是:
{ call schema.NAME_PROCEDURE(${par1},${par2},${par3}) }
这是你真正想要的。如果 par1-3 都是数字,你可以接受,但如果它们是字符串(或其他一些会通过替换被强制转换为字符串的类型),这可能不是有效的 SQL,因此你的 SQL 异常。
基本上字符串 + GString = 字符串。Groovy SQL 需要一个 GString 实例,以便它可以为此查询正确设置绑定列表。
您可以通过将字符串强制为“GString”实例来解决此问题。GString 被定义为 GString + String = GString。您可以在 groovy 控制台上看到这一点:
groovy> def par1 = 1
groovy> def par2 = 2
groovy> def par3 = 3
groovy> def schema = 'myschema'
groovy> println (("{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}").class)
groovy> println ((GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par2,$par3)}").class)
class java.lang.String
class groovy.lang.GString$2
通过将“{call”强制为 GString 实例,这将沿着“加号”调用级联,因此您可以确保 Groovy SQL 获得创建“正确”绑定列表/SQL 所需的输入。