Java 光标已关闭

Java 光标已关闭,java,oracle,hibernate,stored-procedures,Java,Oracle,Hibernate,Stored Procedures,我正在使用struts框架。我收到一个“光标已关闭”错误。 我已经检查了我的StoredProcess,它在oracle中运行良好,但仍然出现“游标已关闭”错误 原因: java.sql.SQLException:游标已关闭。 位于oracle.jdbc.driver.T4CResultSetAccessor.getCursor(T4CResultSetAccessor.java:323) 位于oracle.jdbc.driver.ResultSetAccessor.getObject(Resu

我正在使用struts框架。我收到一个“光标已关闭”错误。 我已经检查了我的StoredProcess,它在oracle中运行良好,但仍然出现“游标已关闭”错误

原因: java.sql.SQLException:游标已关闭。 位于oracle.jdbc.driver.T4CResultSetAccessor.getCursor(T4CResultSetAccessor.java:323) 位于oracle.jdbc.driver.ResultSetAccessor.getObject(ResultSetAccessor.java:85) 位于oracle.jdbc.driver.OracleCallableStatement.getObject(OracleCallableStatement.java:1401)
您能帮我理解这是什么原因吗?

因为您没有提供代码,但根据我的假设,您打开过程返回一个游标,但同时可能在同一过程中关闭游标

PROCEDURE S_S_TEST( 
  test_OUT OUT OAS_TYPES.REFCURSOR
) 
AS
BEGIN
  OPEN test_OUT FOR      
      SELECT *
      FROM table_p;
   CLOSE test_OUT;
END S_S_TEST;
Example:
PROCEDURE TEST(RESULT OUT SYS_REFCURSOR) 
AS
BEGIN
  --your all codes
  OPEN RESULT FOR  SELECT * FROM TABLE_NAME;
END TEST;
调用存储过程的客户端负责关闭游标。请删除代码:
关闭测试_OUT


请参阅:

以下问题将在某个时间发布

例:

在上面的示例中(rs.getString(1))尝试访问两次

而不是将(rs.getString(1))分配给一个变量并使用该值

例:


希望您能得到答案。

最初,REF\u游标处于关闭状态,直到您为特定的SQL查询打开游标。如果在打开光标之前,由于某些条件,您从未打开光标,则可能会出现此光标关闭SQL错误。如果未满足该条件,则如果不故意为某些伪值打开光标,则永远不会打开光标。以下是一个例子:

IF condition = TRUE THEN
    OPEN CURSOR cursor_name FOR
    SELECT * FROM table_name;
END IF;
但在这里,条件是错误的。因此,该过程返回一个未打开的游标。在这种情况下,我更喜欢从调用程序中捕获这个特殊的异常。例如,下面是捕获特定类型异常并保持沉默的Java代码

try
{
    cursor = (ResultSet) stmt.getObject(x);
}
catch(SQLException e)
{
    if (!e.getMessage().toLowerCase().contains("cursor is closed")) {
        e.printStackTrace();
    }
}
而不是做

try
{
    cursor = (ResultSet) stmt.getObject(x);
}
catch(SQLException e)
{
    e.printStackTrace();
}

希望您可以将过程out参数作为光标返回调用位置,但您可能没有在过程内部打开/添加out参数光标(
打开SELECT*FROM TABLE_NAME

PROCEDURE S_S_TEST( 
  test_OUT OUT OAS_TYPES.REFCURSOR
) 
AS
BEGIN
  OPEN test_OUT FOR      
      SELECT *
      FROM table_p;
   CLOSE test_OUT;
END S_S_TEST;
Example:
PROCEDURE TEST(RESULT OUT SYS_REFCURSOR) 
AS
BEGIN
  --your all codes
  OPEN RESULT FOR  SELECT * FROM TABLE_NAME;
END TEST;

请发布您认为导致这种情况的代码,以便我们可以了解Struts是不相关的,这是前端。后端是什么样子的?@SeanPatrickFloyd:后端是oracle@ShahnwazAlam是的,很明显。但是通过普通JDBC、MyBatic、Spring JDBC、Hibernate、JPA(等等)访问?@ShahnwazAlam啊,我们到了。现在,如果您使用hibernate调用存储过程,请发布java代码
Example:
PROCEDURE TEST(RESULT OUT SYS_REFCURSOR) 
AS
BEGIN
  --your all codes
  OPEN RESULT FOR  SELECT * FROM TABLE_NAME;
END TEST;