Slick:如何使用读写参数调用存储过程

时间:2018-06-19 11:50:22

标签: scala playframework slick

我正在尝试从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)
}

1 个答案:

答案 0 :(得分:0)

好吧,看起来上面提到的技巧还不完整,需要以某种方式运行声明的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")