如何在grails中使用动态名称调用mysql存储过程

时间:2016-02-11 17:48:26

标签: grails gorm

我要求调用存储过程来获取数据,这里我将通过post数据获取存储过程名称。

我尝试使用GString但没有用,任何人都可以帮我解决这个问题。

提前致谢。

3 个答案:

答案 0 :(得分:0)

这是一个奇怪的,但可能。 Grails / GORM不提供执行存储过程的方法。它不是ORM功能的一部分。 Hibernate也没有。但是,Hibernate确实提供了对JDBC连接的访问​​。所以你可以从Hibernate获得连接,然后用连接创建一个Groovy Sql实例,最后执行你的存储过程。这是一个例子:

import groovy.sql.Sql

SomeDomainClass.withNewSession { session ->
    session.doWork { java.sql.Connection connection ->
        def sql = new Sql(connection)

        sql.call("YOUR STORED PROCEDURE SQL HERE")
    }
}

它的工作原理如下:

  1. 使用您的任何域类,请致电withSession(Closure)以获取Hibernate会话。
  2. 通过会话,调用doWork(Work)以访问会话的JDBC连接。现在,doWork(Work)期望实现 org.hibernate.jdbc.Work 。但是,如果我没记错的话,Groovy可以使用相同的参数进行闭包并强制它来实现接口。
  3. 使用连接,创建Sql实例。你可以跳过这个并用Java查询,但是Groovy的Sql类非常好。
  4. 使用其中一种可用的Sql.call()方法执行存储过程。

答案 1 :(得分:0)

对于那些在Grails 3中使用此方法时没有现有会话的人,您需要将SomeDomainClass.withSession替换为SomeDomainClass.withNewSession

感谢Emmanuel的回答,为我们节省了大量时间!还有杜尔加要求我们确切需要的东西!

(我目前没有足够的声誉发表评论,但这是对Emmanuel在此提交的答案的评论)

答案 2 :(得分:0)

在Postgress SQL中,可以调用存储过程。捕获返回一个数据表,以便您可以将其映射到模型。如下所示。

let stringResult = stringTask.Result
unitTask.Wait()

可以在GORM数据库连接中按以下方式调用

create function activate(confirmationcode text)
  returns TABLE(resultid integer, resultmessage character varying)
language plpgsql
as $$
BEGIN
 ....
END