FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#1
|
|||
|
|||
LLamada a un Procedimiento de un Paquete de Oracle
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 |
#2
|
|||
|
|||
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( ) Cita:
Por otra parte, te felicito por lo bien comentado que lo has dejado. Un saludo. |
#3
|
|||
|
|||
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. |
#4
|
|||
|
|||
Lo Siento
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. |
#5
|
|||
|
|||
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. |
#6
|
|||
|
|||
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 |
#7
|
|||
|
|||
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. |
#8
|
|||
|
|||
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 |
#9
|
|||
|
|||
Cita:
Cita:
Bueno, ahora a lo nuestro Acabo de probar esto en casa (donde tengo Oracle y Java) y funciona perfectamente. Código:
string SQL = "{call miProc(?, ?, ?)}"; callableStatement stmt = conn.prepareCall(SQL); stmt.registerOutParameter(2, java.sql.Types.REF); stmt.execute(); int valorDeRetorno = stmt.getInt(3); 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. |
#10
|
|||
|
|||
Gracias Por Todo
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 |
#11
|
|||
|
|||
Cita:
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 . |
#12
|
|||
|
|||
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 |
|
|
|