Java 和数据库:关于使用多个结果集和游标

Posted

技术标签:

【中文标题】Java 和数据库:关于使用多个结果集和游标【英文标题】:Java and database: on using multiple ResultSets and Cursors 【发布时间】:2012-04-14 19:14:24 【问题描述】:

我正在运行一个 java 方法来调用 Oracle 11.2 数据库中的存储过程。我正在使用 JDBC 连接调用带有 OUT 参数的存储过程,以将数据库游标作为结果集返回给 java 方法。一切正常。

现在我想将第二个结果集返回给 SAME 存储过程中的 java 方法。如果我只是在这个存储过程中添加第二个 OUT 参数并打开第二个游标,那么一切似乎也可以正常工作。

我想知道这样做是否正确,因为两个游标都只是在存储过程中打开,依靠 java 方法来关闭它们。

游标或结果集是否会因为第一个游标是OPENed,然后选择了一些东西,然后第二个游标是OPENed 并选择了不同的东西而导致问题?选择的第二个东西会搞砸第一个选择的东西吗,反之亦然?或者数据库是否足够聪明,可以知道何时打开第二个游标,任何新选择都指向它而不是第一个游标打开?

我对这一切都很陌生,只是想检查一下它是如何将多个游标返回到 java 中的相应结果集中的。感谢任何 cmets。

【问题讨论】:

【参考方案1】:

两个游标是完全不同的实体,它们指向完全不同的查询,这些查询返回完全不同的 SCN 的结果。所以不存在从数据库中混淆的风险。您的 Java 代码将获得单独的 ResultSet 对象,这些对象需要单独获取,因此您的代码需要确保它是从正确的 ResultSet 获取的——如果有任何混淆,则更有可能是您的代码从错误的游标中获取或在所有情况下都无法关闭两个游标。

虽然从存储过程返回多个游标在技术上是完全可能的,但我倾向于怀疑有更好的解决方案。大多数情况下,如果有多个相关游标,则意味着调用代码正在手动编写某种连接操作。如果是这种情况,最好让 Oracle 进行连接并返回一个 REf CURSOR

【讨论】:

以上是关于Java 和数据库:关于使用多个结果集和游标的主要内容,如果未能解决你的问题,请参考以下文章

关于java面向对象中查询结果方法结果集和表格数据绑定的代码

关于java面向对象中查询结果方法结果集和表格数据绑定的代码

游标的作用是啥?

Sql中的游标是干嘛的

关于游标的一些总结

数据库中游标的使用