加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

如何从groovy调用parametrize sql过程

发布时间:2020-12-14 16:22:06 所属栏目:大数据 来源:网络整理
导读:我从groovy运行一些程序: sql.call("{call SCHEMA.NAME_PROCEDURE($par1,$par2,$par3)}"){} 其中sql是数据库连接的实例 这很好用. 现在我需要参数化SCHEMA所以我尝试这样的事情: sql.call("{call ${schema}.NAME_PROCEDURE($par1,$par3)}"){} 要么 sql.cal
我从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所需的输入.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读