如何从groovy调用parametrize sql过程

前端之家收集整理的这篇文章主要介绍了如何从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所需的输入.

猜你在找的Groovy相关文章