【问题标题】:Slick: how to call stored procedure with read-write parametersSlick:如何使用读写参数调用存储过程
【发布时间】:2018-11-28 09:03:36
【问题描述】:

我试图从 Slick 存储过程中调用,该过程只返回使用读取参数作为输入和可写参数作为输出。我结合(在 Play 应用程序中)找到了 here 的 SimpleDBIO 提示, 旧的 tip for calling stored proc in Slick 2.x 和旧的 jsp 代码调用此过程:

@javax.inject.Singleton
class UserDao @Inject()(dbp: models.DatabaseProvider) {

def lookupUser(u: User): Boolean = {
    // param 1 is output one, params 2,3 are input ones
    val callProc = """{BEGIN CALL GET_USR_INF(?, ?, ?); END;}"""
    println (s">>>>>> p1. user=${u.username}")
    SimpleDBIO[Unit] {
        implicit session => {
            println (s">>>>>> p2 ")
            val cs = session.connection.prepareCall(callProc)
            // val cs = session.connection.prepareStatement(callProc)
            println (s">>>>>> p2.1 ")
            cs.registerOutParameter(1, java.sql.Types.INTEGER);
            cs.setString(2, u.username);
            cs.setString(3, u.password);
            println (s">>>>>> p3")
            val result = cs.executeUpdate()
            println (s">>>>>> p4. result=${result}")
            val retStatus = cs.getInt(1)  // general result here
            println (s">>>>>> p5. retStatus=${retStatus}")
        }
    }
    println (s">>>>>> p-end ")

但看起来 SimpleDBIO 中的代码根本没有运行,没有打印点 p2-p5 并且没有跟踪 jdbc 调用。如何正确执行?哪里没有多少 SimpleDBIO 的新手级示例。 如果重要,DatabaseProvider 定义如下:

import javax.inject.{Inject, Provider, Singleton}
import com.typesafe.config.Config
import slick.jdbc.JdbcBackend.Database  //some imports are skipped for brevity
@Singleton
class DatabaseProvider @Inject() (config: Config) extends Provider[Database] {
  lazy val get = Database.forConfig("myapp.database", config)
}

【问题讨论】:

    标签: scala playframework slick


    【解决方案1】:

    好吧,看起来提到的技巧不完整,需要以某种方式运行声明的 SimpleDBIO(请不要笑,为像我这样的新手编写)。而不是 SimpleDBIO,我找到了 SimpleJdbcAction 的示例,它基本上是相同的。所以工作代码如下:

        val a = SimpleJdbcAction { ctx =>
            val cs = ctx.connection.prepareCall(callProc)
            cs.registerOutParameter(1, java.sql.Types.INTEGER);
            cs.setString(2, u.username);
            cs.setString(3, u.password);
            val result = cs.executeUpdate()
            retStatus = cs.getInt(1)
        }
        Await.result(dbp.get.run(a), Duration.Inf)
        println (s">>>>>> p-end, s=$retStatus")
    

    【讨论】:

    • 将这一行:“retStatus = cs.getInt(1)”替换为“cs.getInt(1)”
    猜你喜欢
    • 1970-01-01
    • 2019-09-18
    • 2016-02-25
    • 2015-07-30
    • 1970-01-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多