Estoy usando struts. Me estoy haciendo un «cursor está cerrado» de error.
He comprobado mi storedprocedure y está funcionando bien en oracle, pero todavía estoy recibiendo el «cursor está cerrado» error.

 Causada por: 
java.sql.SQLException: Cursor está cerrado. 
en oracle.jdbc.el controlador.T4CResultSetAccessor.getCursor(T4CResultSetAccessor.java:323) 
en oracle.jdbc.el controlador.ResultSetAccessor.getObject(ResultSetAccessor.java:85) 
en oracle.jdbc.el controlador.OracleCallableStatement.getObject(OracleCallableStatement.java:1401) 

Me puede ayudar a entender lo que causó esto?

  • por favor enviar su código que, en su opinión, causando de este modo que podemos tener una mirada en
  • Struts es irrelevante, que es el front-end. ¿cuál es la parte final como?
  • Parte de atrás es de oracle
  • sí, obviamente. pero se accede a través de la llanura de JDBC, MyBatic, Spring-JDBC, Hibernate, JPA (etc.)?
  • Hibernate
  • ah, nos estamos acercando. Ahora, por favor, puesto que el código java se de llamar al procedimiento almacenado con hibernate

3 Comentarios

  1. 2

    Puesto que no se han proporcionado el código, pero de acuerdo a mi hipótesis, se devuelve un cursor del procedimiento por abrir, pero al mismo tiempo es posible que se cierre el cursor en el mismo procedimiento.

    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;

    El cliente llamar al procedimiento almacenado es responsable de cerrar el cursor. Por favor, quite el código: CLOSE test_OUT;

    Consulte: Cursor está Cerrado

  2. 0

    Algún tiempo por debajo de problema vendrá

    Ex:

    while (rs.next()) {
    
    
                registartionServices.add(new RegistrationServices(rs.getString(1), rs.getString(2), rs.getString(3),
                        rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9)));
                noti[i] rs.getString(1);
                //System.out.println("amountList-" + rs.getString(7));
                //amountList.add(rs.getString(7));
                //serviceList.add(rs.getString(6));
                //serviceListAR.add(rs.getString(6));
                i++;
            }

    En el ejemplo anterior (rs.getString(1) ) está tratando de tener acceso a dos veces.

    Lugar de este asignar (rs.getString(1)) a una variable y utilizar ese valor.

    Ex:

    while (rs.next()) {
                    notid=rs.getString(1);
                    registartionServices.add(new RegistrationServices(notid, rs.getString(2), rs.getString(3),
                            rs.getString(4), rs.getString(5), rs.getString(7), rs.getString(6), rs.getString(9)));
                    noti[i] =notid;
                    //System.out.println("amountList-" + rs.getString(7));
                    //amountList.add(rs.getString(7));
                    //serviceList.add(rs.getString(6));
                    //serviceListAR.add(rs.getString(6));
                    i++;
                }

    Espero que obtuvo la respuesta.

  3. 0

    Inicialmente un REF_CURSOR está en estado cerrado hasta que se abra el cursor para una determinada consulta SQL. Usted puede obtener este Cursor está cerrado error de SQL cuando nunca ha abierto el cursor debido a algunas condiciones antes de abrir el cursor. Si las condiciones no se cumplen, entonces el cursor es que nunca llegue a abrir si no abre el cursor para algunos valores ficticios a propósito. Siguiente es un ejemplo:

    IF condition = TRUE THEN
        OPEN CURSOR cursor_name FOR
        SELECT * FROM table_name;
    END IF;

    Pero aquí, la condición es FALSA. Por lo tanto, el procedimiento devuelve un no-abrió cursor. En situaciones como esta, prefiero coger este particular excepción del programa de llamada. Por ejemplo, el siguiente es un código de Java para coger tipo particular de excepción y estar en silencio.

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

    lugar de hacer

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

Dejar respuesta

Please enter your comment!
Please enter your name here