如何从groovy调用parametrize sql过程
我从groovy运行一些程序:
sql.call("{call SCHEMA.NAME_PROCEDURE($par1,$par2,$par3)}"){} 其中sql是数据库连接的实例 这很好用. 现在我需要参数化SCHEMA所以我尝试这样的事情: sql.call("{call ${schema}.NAME_PROCEDURE($par1,$par3)}"){} 要么 sql.call("{call " + schema + ".NAME_PROCEDURE($par1,$par3)}"){} 但没有成功.我不知道为什么这两个代码片段不起作用.还有一些sqlException.我做错了什么? 请帮忙 编辑: 我发现了类似的问题,但仍然没有答案: http://groovy.329449.n5.nabble.com/Calling-stored-procedures-td344943.html 解决方法
为了比上面的@mtk的答案更明确,请尝试更改:
sql.call("{call " + schema + ".NAME_PROCEDURE($par1,$par3)}"){} 至: sql.call(GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$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 = String. 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,$par3)}").class) groovy> println ((GString.EMPTY + "{call " + schema + ".NAME_PROCEDURE($par1,$par3)}").class) class java.lang.String class groovy.lang.GString$2 通过强制“{call”成为GString实例,然后它将沿着’plus’调用级联,因此您可以确保Groovy SQL获得创建’正确’绑定列表/ SQL所需的输入. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |