gpt4 book ai didi

mysql - 如何使用Slick 3.0调用MySQL中的存储过程和定义函数

转载 作者:可可西里 更新时间:2023-11-01 07:07:01 25 4
gpt4 key购买 nike

我在我的数据库中定义了这样的东西

CREATE FUNCTION fun_totalInvestorsFor(issuer varchar(30)) RETURNS INT
NOT DETERMINISTIC
BEGIN
RETURN (SELECT COUNT(DISTINCT LOYAL3_SHARED_HOLDER_ID)
FROM stocks_x_hldr
WHERE STOCK_TICKER_SIMBOL = issuer AND
QUANT_PURCHASES > QUANT_SALES);
END;

现在我收到了 Stefan Zeiger(Slick 领导)的回复,将我重定向到这里:User defined functions in Slick

我试过(范围内有以下对象):

lazy val db = Database.forURL("jdbc:mysql://localhost:3306/mydb",
driver = "com.mysql.jdbc.Driver", user = "dev", password = "root")
val totalInvestorsFor = SimpleFunction.unary[String, Int]("fun_totalInvestorsFor")
totalInvestorsFor("APPLE") should be (23)

结果:Rep(slick.lifted.SimpleFunction$$anon$2@13fd2ccd fun_totalInvestorsFor, false) 不等于 23

我也试过在 src/main/resources 中有一个 application.conf 是这样的:

tsql = {
driver = "slick.driver.MySQLDriver$"
db {
connectionPool = disabled
driver = "com.mysql.jdbc.Driver"
url = "jdbc:mysql://localhost/mydb"
}
}

然后在我的代码中使用 @StaticDatabaseConfig("file:src/main/resources/application.conf#tsql")

tsql"select fun_totalInvestorsFor('APPLE')" should be (23)

结果:错误:(24, 9) 无法加载@StaticDatabaseConfig("file:src/main/resources/application.conf#tsql"): 找不到键 'tsql' 的配置设置
tsql"select fun_totalInvestorsFor('APPLE')"应该是 (23)
^

我还计划通过 sql"call myProc(v1).as[(Int, Int, Int)]

调用返回一个包含三个值的元组的存储过程

有什么想法吗?

编辑:制作时 sql""""SELECT COUNT(DISTINCT LOYAL3_SHARED_HOLDER_ID)
来自 stocks_x_hldr
其中 STOCK_TICKER_SIMBOL = 发行人和
QUANT_PURCHASES > QUANT_SALES""".as[(Int)]
导致 SqlStreamingAction[Vector[Int], Int, Effect] 而不是文档建议的建议 DBIO[Int] (根据我的推断)

最佳答案

过去一周我遇到了完全相同的问题。经过一些广泛的研究(see my post here,我将添加对我所做的解决方案的完整描述),我决定它不能在 Slick 中完成...严格来说。

但是,我拒绝将纯 JDBC 或 Anorm 添加到我们的解决方案堆栈中,所以我确实找到了一个“可接受的”修复,恕我直言。

解决方案是从Slick获取session对象,然后使用普通的JDBC来管理存储函数/存储过程的调用。到那时,您可以使用任何第三方库来简化它……尽管在我的例子中,我编写了自己的函数来设置调用并返回结果集。

val db = Database.forDataSource(DB.getDataSource)
var response: Option[GPInviteResponse] = None

db.withSession {
implicit session => {
// Set up your call here... (See my other post for a more detailed
// answer with an example:
// procedure is eg., "{?=call myfunction(?,?,?,?)}"
val cs = session.conn.prepareCall(procedure.toString)
// Set up your in and out parameters here
// eg. cs.setLong(index, value)
val result = cs.execute()
val rc = result.head.asInstanceOf[Int]

response = rc match {
// Package up the response to the caller
}
}
}
db.close()

我知道这很简洁,但正如我所说,请参阅其他主题以获得更完整的帖子。我现在正在整理,很快就会发布答案。

关于mysql - 如何使用Slick 3.0调用MySQL中的存储过程和定义函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30307848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com