2

杜比

在 Scala 或 Doobie 方面没有太多经验的情况下,我正在尝试从 DB2 数据库中选择数据。以下查询工作正常并按预期打印 5 名员工。

import doobie.imports._, scalaz.effect.IO

object ScalaDoobieSelect extends App {
    val urlPrefix = "jdbc:db2:"
    val schema = "SCHEMA"
    val obdcName = "ODBC"
    val url = urlPrefix + obdcName + ":" +
              "currentSchema=" + schema + ";" +
              "currentFunctionPath=" + schema + ";"
    val driver = "com.ibm.db2.jcc.DB2Driver"
    val username = "username"
    val password = "password"

    implicit val han = LogHandler.jdkLogHandler       // (ii)

    val xa = DriverManagerTransactor[IO](
        driver, url, username, password
    )

    case class User(id: String, name: String)

    def find(): ConnectionIO[List[User]] =
        sql"SELECT ID, NAME FROM EMPLOYEE FETCH FIRST 10 ROWS ONLY"
            .query[User]
            .process
            .take(5)                                  // (i)
            .list

    find()
        .transact(xa)
        .unsafePerformIO
        .foreach(e => println("ID = %s, NAME = %s".format(e.id, e.name)))
}

问题

当我想读取所有选定的行并删除take(5)时,我有.process.list而不是.process.take(5).list,我得到以下错误。(一世)

com.ibm.db2.jcc.am.SqlException: [jcc][t4][10120][10898][3.64.133] Invalid operation: result set is closed. ERRORCODE=-4470, SQLSTATE=null

我想知道take(5)它不会返回错误的变化。为了获取有关无效操作的更多信息,我尝试启用日志记录。(ii) 不幸的是,流式传输不支持日志记录。如何获取有关导致此错误的操作的更多信息?

普通 JDBC

下面,在我看来,普通的 JDBC 查询按预期工作并返回所有 10 行。

import java.sql.{Connection,DriverManager}

object ScalaJdbcConnectSelect extends App {
    val urlPrefix = "jdbc:db2:"
    val schema = "SCHEMA"
    val obdcName = "ODBC"
    val url = urlPrefix + obdcName + ":" +
              "currentSchema=" + schema + ";" +
              "currentFunctionPath=" + schema + ";"
    val driver = "com.ibm.db2.jcc.DB2Driver"
    val username = "username"
    val password = "password"

    var connection:Connection = _
    try {
        Class.forName(driver)
        connection = DriverManager.getConnection(url, username, password)
        val statement = connection.createStatement
        val rs = statement.executeQuery(
            "SELECT ID, NAME FROM EMPLOYEE FETCH FIRST 10 ROWS ONLY"
        )
        while (rs.next) {
            val id = rs.getString("ID")
            val name = rs.getString("NAME")
            println("ID = %s, NAME = %s".format(id,name))
        }
    } catch {
        case e: Exception => e.printStackTrace
    }
    connection.close
}

环境

从错误消息中可以看出,我正在使用db2jcc.jarversion 3.64.133。DB2 在版本 11 中使用。

4

0 回答 0