Llamar a una función Oracle que devuelve una sola fila

2,066 views
Skip to first unread message

Adrián Córdoba

unread,
Mar 17, 2011, 3:14:08 PM3/17/11
to JavaSOS
Hola Gente!
Tengo el siguiente problema:
Hay una función en una DB Oracle que es la siguiente:

**********************************************************
CREATE OR REPLACE FUNCTION user_data(userId IN  users.user_id%TYPE)
  RETURN users%ROWTYPE AS
userData users%ROWTYPE;
BEGIN

  SELECT * INTO userData
    FROM users
      WHERE user_id = userId;

  RETURN userData;

END user_data;
*************************************************************

Esta función devuelve siempre una única fila de la tabla users.
Yo intenté recuperar esa única fila, de la siguiente manera:

*************************************************************
CallableStatement statement = connection
.prepareCall("{ call ? := get_data(?) }");

statement.registerOutParameter(1, OracleTypes.OTHER);
statement.setInt(2, 103);
statement.execute();
ResultSet rs = (ResultSet) statement.getObject(1);
String value = rs.getString(2);
System.out.println(value);
**************************************************************
Pero así no funciona!
He probado con otros "OracleTypes" sin ningún resultado positivo. (En realidad, no sé tampoco, que tipo me retorna en Java, la función, cuando en Oracle el retorno es "%ROWTYPE".)
Tampoco estoy seguro si es un ResultSet, si en realidad es una sola fila, la que está retornando.

Por favor, alguien me puede ayudar a recuperar esta fila.

Mil gracias.

--
[Adrián E. Córdoba]

Jose Antonio Gomez

unread,
Mar 17, 2011, 4:37:16 PM3/17/11
to jav...@googlegroups.com
Buenas estimado no he echo esto con una funcion pero si con un procedimiento almacenado, la sintaxis en sql  es la siguiente :

CREATE OR REPLACE PROCEDURE DBVENTAS.BOTELLERIA_APR_SELECCIONAR (
P_PLANTA IN VARCHAR2,P_ACCION IN VARCHAR2,P_EJECUTADO IN NUMBER, res out sys_refcursor)
IS
BEGIN
        IF(P_EJECUTADO>0)THEN
                open res for SELECT PLANTA, NRO_BOLETA, FECHA, COD_PRODUCTO, ACCION, NOM_PRO, DESCRIPCION, CANTIDAD, EJECUTADO FROM  .BOTELLERIA_PLANTA_APROBADA 
                WHERE EJECUTADO LIKE P_EJECUTADO AND PLANTA LIKE P_PLANTA AND ACCION LIKE P_ACCION ;
     
END;
/
la llamada en java seria asi :

String sql = "{CALL BOTELLERIA_APR_INSERTAR(?,?,?,?,?,?,?,?,?)}";
CallableStatement stmt = transaccion.prepareCall(sql);
stmt.setString(1,botelleria_planta_aprobada.getPlanta());
stmt.setString(2,botelleria_planta_aprobada.getNro_boleta());
stmt.setDate(3,new Date(botelleria_planta_aprobada.getFecha().getTime()));
stmt.setString(4,botelleria_planta_aprobada.getCod_producto());
stmt.setString(5,botelleria_planta_aprobada.getAccion());
stmt.setString(6,botelleria_planta_aprobada.getNom_pro());
stmt.setString(7,botelleria_planta_aprobada.getDescripcion());
stmt.setDouble(8,botelleria_planta_aprobada.getCantidad());
stmt.setDouble(9,botelleria_planta_aprobada.getEjecutado());
stmt.execute();
stmt.close();

Espero que te sirva chau.

--
www.JavaSOS.com
Grupo de colaboración Java/J2ee para desarrolladores de habla hispana.



--
Ing. José Atonio Gómez V.

Adrián E. Córdoba

unread,
Mar 18, 2011, 8:07:43 AM3/18/11
to JavaSOS
José:
Gracias por responder!.
Pero me parece que esas partes de código no se corresponden: el
Procedure de Oracle es "BOTELLERIA_APR_SELECCIONAR" y el código Java
llama a "BOTELLERIA_APR_INSERTAR".
A mi me interesa la parte de recuperar una fila, o sea la parte de
Java que invoca al Procedure "BOTELLERIA_APR_SELECCIONAR". De todas
maneras veo que lo está haciendo con Cursores y mi función retorna un
ROWTYPE.
De todas maneras apreciaría el código Java qu invoca a
"BOTELLERIA_APR_SELECCIONAR".

Nuevamente, muchas gracias.

On Mar 17, 5:37 pm, Jose Antonio Gomez <joseg...@gmail.com> wrote:
> Buenas estimado no he echo esto con una funcion pero si con un procedimiento
> almacenado, la sintaxis en sql  es la siguiente :
>
> *CREATE OR REPLACE PROCEDURE DBVENTAS.BOTELLERIA_APR_SELECCIONAR (*
> *P_PLANTA IN VARCHAR2,P_ACCION IN VARCHAR2,P_EJECUTADO IN NUMBER, res out
> sys_refcursor)*
> *IS*
> *BEGIN*
> *        IF(P_EJECUTADO>0)THEN*
> *                open res for SELECT PLANTA, NRO_BOLETA, FECHA,
> COD_PRODUCTO, ACCION, NOM_PRO, DESCRIPCION, CANTIDAD, EJECUTADO FROM
>  .BOTELLERIA_PLANTA_APROBADA *
> *                WHERE EJECUTADO LIKE P_EJECUTADO AND PLANTA LIKE P_PLANTA
> AND ACCION LIKE P_ACCION ;*
> *     *
> *END;*
> */*
> la llamada en java seria asi :
>
> *
> String sql = "{CALL BOTELLERIA_APR_INSERTAR(?,?,?,?,?,?,?,?,?)}";
> CallableStatement stmt = transaccion.prepareCall(sql);
> stmt.setString(1,botelleria_planta_aprobada.getPlanta());
> stmt.setString(2,botelleria_planta_aprobada.getNro_boleta());
> stmt.setDate(3,new Date(botelleria_planta_aprobada.getFecha().getTime()));
> stmt.setString(4,botelleria_planta_aprobada.getCod_producto());
> stmt.setString(5,botelleria_planta_aprobada.getAccion());
> stmt.setString(6,botelleria_planta_aprobada.getNom_pro());
> stmt.setString(7,botelleria_planta_aprobada.getDescripcion());
> stmt.setDouble(8,botelleria_planta_aprobada.getCantidad());
> stmt.setDouble(9,botelleria_planta_aprobada.getEjecutado());
> stmt.execute();
> stmt.close();
> *
> *
> *
> Espero que te sirva chau.
>
> El 17 de marzo de 2011 15:14, Adrián Córdoba <software.a...@gmail.com>escribió:
>
> > Hola Gente!
> > Tengo el siguiente problema:
> > Hay una función en una DB Oracle que es la siguiente:
>
> > **********************************************************
> > CREATE OR REPLACE FUNCTION user_data(userId IN  users.user_id%TYPE)
> >   RETURN users%ROWTYPE AS
> > userData users%ROWTYPE;
> > BEGIN
>
> >   SELECT * INTO userData
> >     FROM users
> >       WHERE user_id = userId;
>
> >   RETURN userData;
>
> > END user_data;
> > *************************************************************
>
> > Esta función devuelve siempre una única fila de la tabla users.
> > Yo intenté recuperar esa única fila, de la siguiente manera:
>
> > *************************************************************
> > CallableStatement statement = connection
> >  .prepareCall("{ call ? := get_data(?) }");
>
> > statement.registerOutParameter(1, *OracleTypes.OTHER*);
> >  statement.setInt(2, 103);
> > statement.execute();
> > *ResultSet rs = (ResultSet) statement.getObject(1);*
> > * String value = rs.getString(2);*
> > * System.out.println(value);*

Jose Antonio Gomez

unread,
Mar 18, 2011, 8:35:18 AM3/18/11
to jav...@googlegroups.com
ups!!!!! mil disculpas estimado...  aqui esta el codigo

String sql = "{CALL BOTELLERIA_APR_SELECCIONAR(?,?,?,?)}";
CallableStatement stmt = conexion.prepareCall(sql);
stmt.setString(1,botelleria_planta_aprobada.getPlanta());
stmt.setString(2,botelleria_planta_aprobada.getAccion());
stmt.setDouble(3,botelleria_planta_aprobada.getEjecutado());
stmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);
stmt.execute();
ResultSet rs = (ResultSet)stmt.getObject(4);
while (rs.next()) {
OBotelleria_planta_aprobada botelleria_planta_aprobada1 = new OBotelleria_planta_aprobada();
botelleria_planta_aprobada1.setPlanta(rs.getString("PLANTA"));
botelleria_planta_aprobada1.setNro_boleta(rs.getString("NRO_BOLETA"));
botelleria_planta_aprobada1.setFecha(rs.getDate("FECHA"));
botelleria_planta_aprobada1.setCod_producto(rs.getString("COD_PRODUCTO"));
botelleria_planta_aprobada1.setAccion(rs.getString("ACCION"));
botelleria_planta_aprobada1.setNom_pro(rs.getString("NOM_PRO"));
botelleria_planta_aprobada1.setDescripcion(rs.getString("DESCRIPCION"));
botelleria_planta_aprobada1.setCantidad(rs.getDouble("CANTIDAD"));
botelleria_planta_aprobada1.setEjecutado(rs.getDouble("EJECUTADO"));
datos.add(botelleria_planta_aprobada1);
}
stmt.close();

Adrián E. Córdoba

unread,
Mar 18, 2011, 12:04:57 PM3/18/11
to JavaSOS
Bien José. Está muy claro.
Pero esa iteración en el ResultSet indica que "podría haber mas de una
fila devuelta", por lo cual usa un Cursor.
El problema es que yo no tengo posibilidades de definir un Cursor, y
la función me devuelve una única fila.
¿Cómo la recupero desde Java?

¿Alguna idea de algún Java master (sensei)?

Muchas gracias.

On 18 mar, 09:35, Jose Antonio Gomez <joseg...@gmail.com> wrote:
> ups!!!!! mil disculpas estimado...  aqui esta el codigo
>
> * String sql = "{CALL BOTELLERIA_APR_SELECCIONAR(?,?,?,?)}";*
> * CallableStatement stmt = conexion.prepareCall(sql);*
> * stmt.setString(1,botelleria_planta_aprobada.getPlanta());*
> * stmt.setString(2,botelleria_planta_aprobada.getAccion());*
> * stmt.setDouble(3,botelleria_planta_aprobada.getEjecutado());*
> * stmt.registerOutParameter(4, oracle.jdbc.OracleTypes.CURSOR);*
> * stmt.execute();*
> * ResultSet rs = (ResultSet)stmt.getObject(4);*
> * while (rs.next()) {*
> * OBotelleria_planta_aprobada botelleria_planta_aprobada1 = new
> OBotelleria_planta_aprobada();*
> * botelleria_planta_aprobada1.setPlanta(rs.getString("PLANTA"));*
> * botelleria_planta_aprobada1.setNro_boleta(rs.getString("NRO_BOLETA"));*
> * botelleria_planta_aprobada1.setFecha(rs.getDate("FECHA"));*
> * botelleria_planta_aprobada1.setCod_producto(rs.getString("COD_PRODUCTO"));
> *
> * botelleria_planta_aprobada1.setAccion(rs.getString("ACCION"));*
> * botelleria_planta_aprobada1.setNom_pro(rs.getString("NOM_PRO"));*
> * botelleria_planta_aprobada1.setDescripcion(rs.getString("DESCRIPCION"));*
> * botelleria_planta_aprobada1.setCantidad(rs.getDouble("CANTIDAD"));*
> * botelleria_planta_aprobada1.setEjecutado(rs.getDouble("EJECUTADO"));*
> * datos.add(botelleria_planta_aprobada1);*
> * *
> * }*
> * stmt.close();*
>
> El 18 de marzo de 2011 08:07, Adrián E. Córdoba
> <software.a...@gmail.com>escribió:

Claudio Altamirano

unread,
Mar 18, 2011, 12:20:31 PM3/18/11
to jav...@googlegroups.com
Select a,b,c
into a1,b1,c1.

parametros de output


Atte
Claudio

Adrián E. Córdoba

unread,
Mar 20, 2011, 7:39:36 AM3/20/11
to JavaSOS
Claudio:
Muchas gracias!
Tenés razón... No se me había ocurrido.

Saludos.

On Mar 18, 12:20 pm, Claudio Altamirano <cjaltamir...@gmail.com>
wrote:
> Select a,b,c
> into a1,b1,c1.
>
> parametros de output
>
> Atte
> Claudio
>
> El 18 de marzo de 2011 13:04, Adrián E. Córdoba
> <software.a...@gmail.com>escribió:
Reply all
Reply to author
Forward
0 new messages