Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   Java (http://www.forosdelweb.com/f45/)
-   -   CallableStatement (http://www.forosdelweb.com/f45/callablestatement-306500/)

antony_fire 09/06/2005 16:04

CallableStatement
 
Hola a todos.

Ultimamente he estado desarrollando mi proyecto de grado y he tenido un problema, en adelante le comento mi problemita.

He creado un procedimiento almacenado en firebird, este procedimiento retorna una tabla de 13 columnas por N filas, bien, lo intente hacer de la siguiente forma, observemos el siguiente codigo:

rs = st.executeQuery("SELECT * FROM OBTENER_CARTERA('2005/01/01')");
while(rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println(rs.getObject(6));
System.out.println(rs.getObject(7));
System.out.println(rs.getObject(8));
System.out.println(rs.getObject(9));
System.out.println(rs.getObject(10));
System.out.println(rs.getObject(11));
System.out.println(rs.getObject(12));
System.out.println(rs.getObject(13));
}

Bueno, este codigo arroja una exception que informa que el indice 9 no existe, pero claro que existe por que yo le hago el mismo query directo sobre la base de datos por medio del ibconsole y me arroja todos los resultados.

Bien, ya que lo anterior no funcionó, decidí utilizar una interfaz del paquete java.sql que se llama CallableStatement el codigo que realize es el siguiente, pongamos atencion.

Connection con = DriverManager.getConnection(ENLACE_LOGICO,USER,PAS SWORD);
ResultSet rs = null;
java.sql.CallableStatement cs = con.prepareCall("{call PRO_CALC_CARTERA(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
cs.setTimestamp(1,java.sql.Timestamp.valueOf("2006-11-11 00:00:00.0"));
cs.registerOutParameter(2,java.sql.Types.VARCHAR);
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.registerOutParameter(4,java.sql.Types.VARCHAR);
cs.registerOutParameter(5,java.sql.Types.VARCHAR);
cs.registerOutParameter(6,java.sql.Types.VARCHAR);
cs.registerOutParameter(7,java.sql.Types.VARCHAR);
cs.registerOutParameter(8,java.sql.Types.VARCHAR);
cs.registerOutParameter(9,java.sql.Types.INTEGER);
cs.registerOutParameter(10,java.sql.Types.VARCHAR) ;
cs.registerOutParameter(11,java.sql.Types.DATE);
cs.registerOutParameter(12,java.sql.Types.FLOAT);
cs.registerOutParameter(13,java.sql.Types.FLOAT);
cs.registerOutParameter(14,java.sql.Types.INTEGER) ;
//rs = (ResultSet)cs.getObject(1);
rs = cs.executeQuery();
while(rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println(rs.getObject(6));
System.out.println(rs.getObject(7));
System.out.println(rs.getObject(8));
System.out.println(rs.getObject(9));
System.out.println(rs.getObject(10));
System.out.println(rs.getObject(11));
System.out.println(rs.getObject(12));
System.out.println(rs.getObject(13));
}

Porsupesto que este codigo tampoco sirve.

si alguno de ustedes sabe como hacer lo que estoy haciendo o si alguien quiere que sea mas explicito por favor responda a este mensage, muchas gracias por la colaboracion que me puedan brindar...

Adios amigos.

qgqlochekone 07/03/2008 15:27

Re: CallableStatement
 
tal vez el comportamiento en consola deriva del de el JDBC

ademas, seria bueno pongas la traza de la execpcion, pero completa, muchas veces la raiz esta en otro lado, puede ser que rs.getObject(9) genera una exepcion desde le propio backen

GreenEyed 09/03/2008 06:23

Re: CallableStatement
 
¿Seguro que el driver JDBC y la BDD permiten realizar llamadas a procedimientos que devuelvan cursores?

Pocas BDD lo permiten y normalmente hay que declarar los objetos de forma especial.

S!

sanmi69 13/03/2008 03:32

Re: CallableStatement
 
Cita:

Iniciado por antony_fire (Mensaje 1132820)
Hola a todos.

Ultimamente he estado desarrollando mi proyecto de grado y he tenido un problema, en adelante le comento mi problemita.

He creado un procedimiento almacenado en firebird, este procedimiento retorna una tabla de 13 columnas por N filas, bien, lo intente hacer de la siguiente forma, observemos el siguiente codigo:

rs = st.executeQuery("SELECT * FROM OBTENER_CARTERA('2005/01/01')");
while(rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println(rs.getObject(6));
System.out.println(rs.getObject(7));
System.out.println(rs.getObject(8));
System.out.println(rs.getObject(9));
System.out.println(rs.getObject(10));
System.out.println(rs.getObject(11));
System.out.println(rs.getObject(12));
System.out.println(rs.getObject(13));
}

Bueno, este codigo arroja una exception que informa que el indice 9 no existe, pero claro que existe por que yo le hago el mismo query directo sobre la base de datos por medio del ibconsole y me arroja todos los resultados.

Bien, ya que lo anterior no funcionó, decidí utilizar una interfaz del paquete java.sql que se llama CallableStatement el codigo que realize es el siguiente, pongamos atencion.

Connection con = DriverManager.getConnection(ENLACE_LOGICO,USER,PAS SWORD);
ResultSet rs = null;
java.sql.CallableStatement cs = con.prepareCall("{call PRO_CALC_CARTERA(?,?,?,?,?,?,?,?,?,?,?,?,?,?)}");
cs.setTimestamp(1,java.sql.Timestamp.valueOf("2006-11-11 00:00:00.0"));
cs.registerOutParameter(2,java.sql.Types.VARCHAR);
cs.registerOutParameter(3,java.sql.Types.VARCHAR);
cs.registerOutParameter(4,java.sql.Types.VARCHAR);
cs.registerOutParameter(5,java.sql.Types.VARCHAR);
cs.registerOutParameter(6,java.sql.Types.VARCHAR);
cs.registerOutParameter(7,java.sql.Types.VARCHAR);
cs.registerOutParameter(8,java.sql.Types.VARCHAR);
cs.registerOutParameter(9,java.sql.Types.INTEGER);
cs.registerOutParameter(10,java.sql.Types.VARCHAR) ;
cs.registerOutParameter(11,java.sql.Types.DATE);
cs.registerOutParameter(12,java.sql.Types.FLOAT);
cs.registerOutParameter(13,java.sql.Types.FLOAT);
cs.registerOutParameter(14,java.sql.Types.INTEGER) ;
//rs = (ResultSet)cs.getObject(1);
rs = cs.executeQuery();
while(rs.next()) {
System.out.println(rs.getObject(1));
System.out.println(rs.getObject(2));
System.out.println(rs.getObject(3));
System.out.println(rs.getObject(4));
System.out.println(rs.getObject(5));
System.out.println(rs.getObject(6));
System.out.println(rs.getObject(7));
System.out.println(rs.getObject(8));
System.out.println(rs.getObject(9));
System.out.println(rs.getObject(10));
System.out.println(rs.getObject(11));
System.out.println(rs.getObject(12));
System.out.println(rs.getObject(13));
}

Porsupesto que este codigo tampoco sirve.

si alguno de ustedes sabe como hacer lo que estoy haciendo o si alguien quiere que sea mas explicito por favor responda a este mensage, muchas gracias por la colaboracion que me puedan brindar...

Adios amigos.


no entiendo bien lo que has querido hacer con el callable statement.

Si tu procedimiento tienen 1 parametro porq le pasas 14 parametros???
Te pongo la solucion si la bbdd fuera oracle:

Código PHP:

 Connection con DriverManager.getConnection(ENLACE_LOGICO,USER,PASSWORD);
        
ResultSet rs null;
        
java.sql.CallableStatement cs con.prepareCall("{CALL ?:=PRO_CALC_CARTERA(?)}");
        
cs.registerOutParameter(1,OracleTypes.CURSOR);
        
cs.setTimestamp(2,java.sql.Timestamp.valueOf("2006-11-11 00:00:00.0"));
 
cs.execute();
 
rs = (ResultSet)cs.getObject(1);
        while(
rs.next()) {
            
System.out.println(rs.getObject(1));
            
System.out.println(rs.getObject(2));
            
System.out.println(rs.getObject(3));
            
System.out.println(rs.getObject(4));
            
System.out.println(rs.getObject(5));
            
System.out.println(rs.getObject(6));
            
System.out.println(rs.getObject(7));
            
System.out.println(rs.getObject(8));
            
System.out.println(rs.getObject(9));
            
System.out.println(rs.getObject(10));
            
System.out.println(rs.getObject(11));
            
System.out.println(rs.getObject(12));
            
System.out.println(rs.getObject(13));
        } 

Depende de la BBDD, la solucion puede ser asi tb:

Código PHP:

 Connection con DriverManager.getConnection(ENLACE_LOGICO,USER,PASSWORD);
       
ResultSet rs null;
       
java.sql.CallableStatement cs con.prepareCall("{CALL PRO_CALC_CARTERA(?)}");      
       
cs.setTimestamp(1,java.sql.Timestamp.valueOf("2006-11-11 00:00:00.0"));
cs.execute();
rs cs.executeQuery();
       while(
rs.next()) {
           
System.out.println(rs.getObject(1));
           
System.out.println(rs.getObject(2));
           
System.out.println(rs.getObject(3));
           
System.out.println(rs.getObject(4));
           
System.out.println(rs.getObject(5));
           
System.out.println(rs.getObject(6));
           
System.out.println(rs.getObject(7));
           
System.out.println(rs.getObject(8));
           
System.out.println(rs.getObject(9));
           
System.out.println(rs.getObject(10));
           
System.out.println(rs.getObject(11));
           
System.out.println(rs.getObject(12));
           
System.out.println(rs.getObject(13));
       } 


sanmi69 13/03/2008 09:36

Re: CallableStatement
 
Cita:

Iniciado por qgqlochekone (Mensaje 2313989)
tal vez el comportamiento en consola deriva del de el JDBC

ademas, seria bueno pongas la traza de la execpcion, pero completa, muchas veces la raiz esta en otro lado, puede ser que rs.getObject(9) genera una exepcion desde le propio backen

joer macho rescatando post de 3 años??? jejeje

arrieta 27/04/2008 13:26

Re: ¿Qué tengo que importar?
 
Hola, quiero hacer un insert en la base de datos oracle y para ello necesito saber que "using"-s necesito definir.

en java son :
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;

Y cómo puedo saber que "using ...." son en c#??? estoy definiendo la conexión en una clase .cs.

Gracias

GreenEyed 28/04/2008 06:35

Re: CallableStatement
 
Quiza te puedan ayudar mejor en foro de C#, ya que este es de Java.

S!


La zona horaria es GMT -6. Ahora son las 00:20.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.