Scala Slick:如何使用读写参数调用存储过程
我试图从Slick存储过程调用,该存储过程只返回读取参数作为输入,可写参数作为输出。我结合(在游戏中应用)SimpleDBIO提示发现, 调用此过程的旧jsp代码和旧jsp代码:Scala Slick:如何使用读写参数调用存储过程,scala,playframework,slick,Scala,Playframework,Slick,我试图从Slick存储过程调用,该存储过程只返回读取参数作为输入,可写参数作为输出。我结合(在游戏中应用)SimpleDBIO提示发现, 调用此过程的旧jsp代码和旧jsp代码: @javax.inject.Singleton class UserDao @Inject()(dbp: models.DatabaseProvider) { def lookupUser(u: User): Boolean = { // param 1 is output one, params 2,3 a
@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的新手级示例。
数据库提供程序定义如下(如果有关系):
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)
}
好吧,看起来上面提到的技巧还不完整,需要以某种方式运行声明的SimpleBio(请不要笑,是为像我这样的新手编写的)。我发现SimpleJdbcAction的示例与SimpleDBBio的示例基本相同,而不是SimpleDBBio。因此,工作代码如下:
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)”