PDA

Ver la Versión Completa : LLamada a un Procedimiento de un Paquete de Oracle


samuvk
11-05-2004, 19:48:02
Estoy llamando a un porcedimiento de un paquete de Oracle desde Java con JDBC, pero una de las salidas que me produce el procedimiento es una tabla y no se como tratarla.

He realizado el siguiente código, y no se que es lo que esta mal:

String aString="transporte publico";

CallableStatement cstmt = null;
try
{ //FUNCION DE LLAMADA AL PAQUETE
cstmt = con.prepareCall("begin user1552.paqueteusuario.pr_qconcepto0 (?,?,?); end;");
//REGISTRO LA SALIDA DE LA TABLA COMO UN REF, se supone que es el tipo equivalente a ResultSet
cstmt.registerOutParameter(2,Types.REF);
//REGSITRO LAS SALIDA DEL ÚLTIMO PARAMETRO COMO UN ENTERO
cstmt.registerOutParameter(3, Types.INTEGER);
//INTRODUZCO EN LA POSICION UNO EL TERMINO QUE QUIERO
cstmt.setString(1,aString);
//OBTENGO EL NUMERO DE CONCEPTOS QUE TENGO PARA ESE TERMINO
int resultado2 = cstmt.getInt(3);
System.out.println(resultado2);
//EJECUTO
cstmt.execute(); }
catch (SQLException ejecucion)
{ System.out.println("Error: " + ejecucion.getMessage()); }

En java se compila bien, pero al ejecutarlo me da el siguiente error:
Tipo de parametro incompatible: sqlType=2006

Muchas Gracias

santana
12-05-2004, 03:12:23
Hola, samuvk.

De entrada, no veo ningún error en el código. Depura tu programa a ver si te la excepción te salta cuando llamas al método execute( )


2006: Dynamic SQL error - INTO clause not allowed for non SELECT statements. An EXECUTE was used in conjunction with an INTO clause, though the statement executed is not a SELECT. Remove the INTO clause or use a USING clause if you are using dynamic parameter.


Te aconsejo que la próxima vez hagas uso de las etiquetas para mostrar el código, con lo cual al resto de usuarios le resultará más cómodo de leer. Tienes el enlace con todas las etiquetas disponibles en mi firma.

Por otra parte, te felicito por lo bien comentado que lo has dejado.

Un saludo.

santana
12-05-2004, 03:30:41
Hola de nuevo.

Se me olvidó decirte que para hacer la conversión de tipos que no te soporta el driver JDBC (pero que sí es soportado por Oracle) tienes la siguiente función:

CONVERT (valor,sqlType)

Saludos.

samuvk
12-05-2004, 19:16:24
Lo siento pero creo no haberte entendido muy bien. Por lo que veo en la pruebas que estoy haciendo el problema estea en la siguiente sentencia:

cstmt.registerOutParameter(2,Types.REF);

Que se supone que deberia coger el valor de la tabla que señalo en rojo en la sentencia anterior:

cstmt = con.prepareCall("begin user1552.paqueteusuario.pr_qconcepto0 (?,?,?); end;");

En el procedimiento correspondiente pr_qconcepto0, en la segunda posicion tenemos una variable de salida, que nos devuelve una tabla, y al ejecutar :

cstmt.registerOutParameter(2,Types.REF);

Me da el Error que te comente:
Error: Tipo de parßmetro incompatible: sqlType=2006

He intentado utilizar lo que me comentastes del convert(elemento,sqlType)

Pero la verdad es que no se me ocurre la forma de hacerlo.

Creo que el problema es por que el tipo de datos REF, no es el mismo que ResultSet, si por casualidad supieras cual es el tipo de datos que tengo que poner en : cstmt.registerOutParameter(2,Types.REF);
en vez de REF y que fuera equivalente a ResultSet te lo aradecería enormemente, por que he intentado poner ResultSet en lugar de REF, pero me da error de compilacion, diciendome que no puede resolver el simbolo.

Muchas Gracias por todo y perona por las molestias.

santana
12-05-2004, 19:40:16
Hola.

Me parece exagerado y de no muy buen gusto, que me envies un email 2 minutos despues de dejar tu post para que repare en tu mensaje.

No dudo que sea urgente, todos los mensajes lo son en estos foros.
Tal vez en este momento estoy en mi trabajo, tal vez estoy buscando documentación para ayudar a otro forista que también tiene un problema, y que seguramente será tan urgente como el tuyo. O tal vez las dos cosas. Y lo primero es lo primero, o sea, cumplir con mi trabajo, que es por lo que me pagan. Si tú puedes mejorar la oferta, tal vez puedas contratarme y me tendrás en exclusiva.


En respuesta a tu post y a tu email, si te molestas en utilizar un buscador (por ejemplo, google.com), podrás encontrar muchisimos ejemplos de como utilizar la función convert.

Por otra parte, no esperes que este foro sea un servicio técnico de atención inmediata. Ese tipo de servicios son de pago y las personas que colaboran en estos foros lo hacen desinteresadamente.

Te sugiero que leas la guía de estilo de los foros para una mejor convivencia.

Gracias por tu atención.

samuvk
12-05-2004, 19:49:39
Tienes razon, lo siento haber sido tan precipitado, pero es que llevo 3 dias con este problema y no consigo resolverlo y me hace estar un poco desesperado.

Seguiré investigando con lo que me has dicho.

Muchas Gracias

santana
12-05-2004, 19:57:16
Hola.

También yo te doy las gracias por tu comprensión.

Verás que investigar por ti mismo y conseguir solucionar los problemas, te proporcionará una gran satisfacción.

Sigo contando con tu presencia en estos foros y tú sigues contando con nuestra ayuda (en la medida de nuestras posibilidades).

Un saludo.

samuvk
12-05-2004, 20:03:06
ok, gracias, te mande el mail de todas formas por que no sabía en que medida leíais los mensajes.

Gracias y si veo que sigo sin conseguir lo que busco en un día o un par de días volveré a preguntaros con mis nuevas investigaciones.

Gracias de nuevo

santana
12-05-2004, 22:50:19
no sabía en que medida leíais los mensajes
En la medida de lo posible. También para los moderadores de los foros de programación existe la vida fuera de la pantalla ;)

volveré a preguntaros con mis nuevas investigaciones.
Ha sido muy grato encontrarme estas palabras al regresar del trabajo.

Bueno, ahora a lo nuestro :D
Acabo de probar esto en casa (donde tengo Oracle y Java) y funciona perfectamente.



string SQL = "{call miProc(?, ?, ?)}";
callableStatement stmt = conn.prepareCall(SQL);
stmt.registerOutParameter(2, java.sql.Types.REF);
stmt.execute();
int valorDeRetorno = stmt.getInt(3);



La interface ResultSet se utiliza para acceder a los datos devueltos por una consulta: una fila de la tabla.
El método result.next mueve hasta la siguiente fila recuperada (en caso de que la consulta devuelva varias).

El tipo de dato REF se declara para referenciar a un tipo estructurado y puedes operar con él como si fuera el objeto al que representa. Se les llama punteros lógicos.

Espero haberte dado suficiente material como para que te pongas a investigar. Verás lo mucho que aprendes.

Saludos y suerte.

samuvk
17-05-2004, 16:56:54
Muchas Gracias por todo

Encontre otra solucion alternativa, que es desde oracle recoger la tabla y devolver el primer elemento de la tabla a java, y desde java con el JDBC recorrelo uno a uno, es un poco chapucero pero funciona.

Muchas Gracias por vuestra ayuda

santana
17-05-2004, 17:16:19
Muchas Gracias por vuestra ayuda
Tú eres quien más se ha ayudado.

Los driver JDBC no tienen soporte para recuperarte una tabla de Oracle, supongo que eso ya lo has descubierto mirando los tipos de datos SQL-3 que soporta el JDBC 2.0.

Gracias a tí por todo y saludos ;).

samuvk
18-05-2004, 14:04:36
Hola de nuevo, siento tener que seguir preguntando sobre este tema, pero es que me estoy volviendo loco.

Lo que quiero hacer a priori es muy sencillo, y no se si es que no me sale por que estoy ya saturado o por que.

Solo quiero asignar una variable de tipo tabla en un procedimiento:

cstmt = con.prepareCall("begin usuario.paquete.procedimiento (?); end;")

lo ideal sería: ResultSet rs;
cstmt.setResultSet(1, rs);

pero como no se puede hay que hacerlo a traves del Ref, que sigo sin poder usarlo:

si que puedo hacer Ref varref; cstmt.setRef(1,varref);
pero lo que no consigo es asignar a varref un resultset;

Lo he intentado de varias maneras y la que más me convence es esta:
ref varref= rs.getRef (1);
pero no me funciona.

¿Alguna sugerencia?

PD: He mirado las APIs de java (que normalmente utilizo), pero es que apenas hay funciones para utilizar ResultSet y Ref, en este aspecto esta bastante limitado Java o quiza es que no se hacer buen uso de lo que proporciona.

Gracias de nuevo por adelantado