Error al pasar un Array como parámetro a un SP en Oracle

39 views
Skip to first unread message

Richard De los Reyes Príncipe

unread,
Jan 31, 2007, 9:31:54 PM1/31/07
to Java...@googlegroups.com
Hola amigos,

Tengo el siguiente problema: Necesito pasar un Array como parámetro a un SP, la BD es Oracle 9i, estoy usando Hibernate 3, por cierto el Driver que estoy usando es el ojdbc14.jar. Les muestro el código que he implementado para que se comprenda mejor el problema:

public String getCalculaCantidadesReservasVenta(Long codPedidoVenta,
            Double[] cantSolicitadas, Long[] codDetalles, String codFilial)
            throws Exception {
        CallableStatement cstmt = null;
        String mensaje = "";
        try {
            Connection conn = getSession().connection();
            logger.debug("Hasta aca todo ok ");
            ArrayDescriptor descCS = ArrayDescriptor.createDescriptor(
                    "NUMBER_NT", conn);
            ARRAY arrayCS = new ARRAY(descCS, conn, cantSolicitadas);
            ArrayDescriptor descCD = ArrayDescriptor.createDescriptor (
                    "NUMBER_NT", conn);
            ARRAY arrayCD = new ARRAY(descCD, conn, codDetalles);
            logger.debug("Despues de crear los arrays");

            StringBuffer consulta = new StringBuffer(
                    " call REP_RESERVA_CANTIDADES_VENTA(?, ?, ?, ?, ?) ");
            logger.debug(" SQL ::>>" + consulta.toString());
            int i = 1;
            cstmt = getSession().connection().prepareCall( consulta.toString());
            cstmt.setLong(i++, codPedidoVenta != null ? codPedidoVenta
                    .longValue() : 0);
            //casteo para setear el Array
            ((OracleCallableStatement) cstmt).setARRAY(i++, arrayCS);
            ((OracleCallableStatement) cstmt).setARRAY(i++, arrayCD);
            cstmt.setString(i++, codFilial);
            cstmt.registerOutParameter(i, Types.VARCHAR);
            cstmt.executeUpdate();
            mensaje = cstmt.getString(i);
            logger.debug ("Mostrando el mensaje::: " + mensaje);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                cstmt.close();
                cstmt = null;
            } catch (Exception ignore) {
                logger.error(ignore);
            }
        }
        return mensaje;
    }

El problema que me arrojo cuando lo ejecuto es un ClassCastException especificamente en ArrayDescriptor descCS = ArrayDescriptor.createDescriptor( "NUMBER_NT", conn);
Aqui esta:

java.lang.ClassCastException
        at oracle.sql.ArrayDescriptor.createDescriptor(ArrayDescriptor.java:103)
        at com.paquete.empresa.dao.ventas.hibernate.PedidoVentaDAOHibernate.getCalculaCantidadesReservasVenta (PedidoVentaDAOHibernate.java:501)
        at com.paquete.empresa.service.ventas.impl.PedidoVentaServiceImpl.savePedidoVenta(PedidoVentaServiceImpl.java:136)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke (Method.java:324)


Estuve buscando, y las posibles soluciones que se planteaban no corregían mi error. La mayoría de ellas coincidían en que el problema era por el Connection que se le pasaba al createDescriptor pues este debe ser un OracleConnection, estuve probando con un OracleConnection oconn = (OracleConnection) conn; sin mayor suerte... Alguno de ustedes a estado en una situación similar?

Muchas gracias anticipadamente,

--
________________________________
Richard De los Reyes Príncipe

Richard De los Reyes Príncipe

unread,
Feb 1, 2007, 11:20:38 AM2/1/07
to Java...@googlegroups.com
Hola amigos,

Finalmente pude resolver el problema, al parecer hacer un OracleCallableStatement.getConnection() es el que me brinda una conexion satisfactoria para el ArrayDescriptor y no arroje el ClassCastException, les incluyo el código modificado, por si hay alguien que desee pasar un Array como parámetro.

public String getCalculaCantidadesReservasVenta(Long codPedidoVenta,
            double[] cantSolicitadas, long[] codDetalles, String codFilial)
            throws Exception {
        OracleCallableStatement cstmt = null;
        String mensaje = "";
        try {
            logger.debug("En el inicio getCalculaCantidadesReservasVenta");
            // ////////////////////////////////////////////////////////////
            StringBuffer consulta = new StringBuffer(
                    " call REP_RESERVA_CANTIDADES_VENTA(?, ?, ?, ?, ?) ");
            logger.debug(" SQL ::>>" + consulta.toString ());
            int i = 1;
            cstmt = (OracleCallableStatement) getSession().connection().prepareCall( consulta.toString() );
           
            ArrayDescriptor descCS = ArrayDescriptor.createDescriptor (
                    "REPUESTOS.NUMBER_NT", cstmt.getConnection());
            ARRAY arrayCS = new ARRAY(descCS, cstmt.getConnection(), cantSolicitadas);
            ArrayDescriptor descCD = ArrayDescriptor.createDescriptor(
                    "REPUESTOS.NUMBER_NT", cstmt.getConnection());
            ARRAY arrayCD = new ARRAY(descCD, cstmt.getConnection(), codDetalles);

            logger.debug("Despues de crear los arrays");
            cstmt.setLong(i++, codPedidoVenta != null ? codPedidoVenta.longValue() : 0);
            cstmt.setARRAY(i++, arrayCS);
            cstmt.setARRAY(i++, arrayCD);
            cstmt.setString(i++, codFilial);
            ((CallableStatement)cstmt).registerOutParameter(i, Types.VARCHAR);
            cstmt.executeUpdate();
            mensaje = cstmt.getString(i);
            logger.debug("Mostrando el mensaje::: " + mensaje);
        } catch (Exception e) {
            logger.error(e);
            e.printStackTrace();
            throw new Exception(e);

        } finally {
            try {
                cstmt.close();
                cstmt = null;
            } catch (Exception ignore) {
                ignore.printStackTrace();
            }
        }
        return mensaje;
    }

Y ya con esto recibo mi array en el Oracle donde lo proceso como el NESTED TABLE que cree como TYPE.

Se acepta cualquier sugerencia y/o observación.

Saludos,

2007/1/31, Richard De los Reyes Príncipe <richardd...@gmail.com >:
Reply all
Reply to author
Forward
0 new messages