有没有办法找出数据库游标是否在Java中打开?

时间:2010-04-29 22:54:25

标签: java jdbc plsql

在JDBC中是否有办法找出JAVA中是否打开游标。 我们在尝试访问未打开的游标时遇到异常。 java.sql.SQLException:光标已关闭。

以下是发生的事情。

存储过程就是这样设计的。 proc返回游标和其他几列。对于某些情况,DB人员不会打开游标并仅返回游标外的其他剩余列。因此,当Java代码尝试获取游标时,它会抛出此异常。我知道,我可以捕获异常并继续进行其余的列。但我想知道是否有不同的(可能更好)的方法来处理这个问题? 或者只需要在存储过程中打开游标,即使光标中没有任何内容可以返回?

5 个答案:

答案 0 :(得分:2)

之前我在Oracle中遇到过这个问题。它与ResultSet无关,它是开放的。该错误是由STP引起的,它可能返回空光标,或者在某些条件下关闭光标。

请检查您使用的所有STP,并确保它始终返回一个打开的光标。

答案 1 :(得分:2)

也许可以更改存储过程以返回指示光标是否打开的值。以下内容可能有用:

TYPE tCursor IS REF CURSOR;

PROCEDURE A_PROC(returned_cursor    OUT tCursor,
                 bCursor_is_open    OUT BOOLEAN,
                 aNother_value      OUT NUMBER,
                 yet_another_value  OUT NUMBER);

如果打开光标,程序应将bCursor_is_open设置为TRUE,如果光标未打开,则设置为FALSE。

答案 2 :(得分:1)

这意味着您没有正确处理ResultSet。 (ResultSet是光标的对象表示。)

不要担心弄清楚如何检查光标是否打开;找出你的ResultSet超出范围的原因,你会回答你自己的问题。

发布一些代码或更详细的解释正在发生的事情。

我的猜测是,当你将ResultSet映射到一个对象或集合并在方法范围内关闭它时,你会将一个ResultSet从持久层传递出来。返回该对象或集合而不是ResultSet。

数据库游标是稀缺资源。您应该保持它们在获取数据所需的最短时间内保持打开状态,然后关闭它们,以便其他人可以使用它们。它有助于提高可扩展性 - 并将此异常作为附带好处解决。

答案 3 :(得分:1)

当您尝试访问ResultSet语句,语句或其连接已关闭时,您将收到此异常。请注意,重复使用语句打开其他ResultSet也会导致所有先前打开的结果集关闭。

查看JDBC代码中的流程。确保它遵循Sun tutorial中概述的标准JDBC惯用法。要了解更多如何正确使用基本JDBC,您可能会发现this article也很有用。

答案 4 :(得分:1)

从1.6开始,ResultSet有一个isClosed方法。我假设您的异常发生在ResultSet上。话虽这么说,我同意其他的答案,如果你看到你的ResultSet从你的下方关闭,你的使用可能有一个缺陷,只是测试isClosed不会帮助你摆脱那个问题 - 当你需要打开它时,你会发现它已经关闭了。