Foros del Web » Programación para mayores de 30 ;) » Java »

Ayuda Procedimiento Almacenado MySQL-Java

Estas en el tema de Ayuda Procedimiento Almacenado MySQL-Java en el foro de Java en Foros del Web. intento hacer solo lo siguiente... ([URL="http://www.youtube.com/watch?v=_847az-sPW4"]Video Youtube[/URL]) obtener la salida de un procedimiento o sea el OUT de un atributo tengo mi procedimiento de esta ...
  #1 (permalink)  
Antiguo 22/08/2010, 05:11
 
Fecha de Ingreso: febrero-2009
Mensajes: 16
Antigüedad: 15 años, 2 meses
Puntos: 0
De acuerdo Ayuda Procedimiento Almacenado MySQL-Java

intento hacer solo lo siguiente... ([URL="http://www.youtube.com/watch?v=_847az-sPW4"]Video Youtube[/URL])

obtener la salida de un procedimiento o sea el OUT de un atributo

tengo mi procedimiento de esta forma, el cual funciona:
Código:
CREATE PROCEDURE ValidarPrgramas_IN(     
           IN _nombreArchivoPrograma         varchar(100),
           IN _nombrePrograma                varchar(100),       
           IN _categoriaPrograma             varchar(20),
           IN _versionPrgrama                decimal(10,4),
           IN _descripcionPrograma           text,
           OUT _textoValidacion              varchar(100)
     )
BEGIN
       #Validación si existe ArchivoPrograma y Version      
       if not exists (select * from Programas where _nombreArchivoPrograma = nombreArchivoPrograma and _versionPrgrama = versionPrgrama) then
       select CONCAT('Ya existe la version ',_versionPrgrama, ' del Archivo ', _nombreArchivoPrograma, ' en la Base de Datos')  into _textoValidacion;       
       else        
       #Insertar a la tabla Programas
       insert into Programas (nombreArchivoPrograma,nombrePrograma,categoriaPrograma,
       versionPrgrama,fechaIngresoPrograma,tiempoIngresoPrograma,descripcionPrograma)
       values (_nombreArchivoPrograma,_nombrePrograma,_categoriaPrograma,_versionPrgrama
       ,curdate(),curtime(),_descripcionPrograma);        
       select 'Insertado Correctamente' into _textoValidacion;
       end if; 

END;

y el método que me conecta es el siguiente:
Código:
private void insertandoDatos() {
            String $sql= "{call ValidarPrgramas_IN (?,?,?,?,?,?)}";
            Connection con = null;
            CallableStatement cs = null;
            String datoRecibido = "";
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/OrganizandoProgramas","root","Abc321");
                cs = (CallableStatement) con.prepareCall($sql);
                cs.setString(1,txt_ArchivoPrograma.getText());
                cs.setString(2,txt_NombrePrograma.getText());
                cs.setString(3,cmb_CategoriaPrograma.getSelectedItem().toString());
                cs.setDouble(4,Double.parseDouble(txt_VersionPrograma.getText()));
                cs.setString(5,txa_DescripcionPrograma.getText());
                cs.registerOutParameter(6,Types.VARCHAR);
                cs.execute();
                datoRecibido = cs.getString(6);
                //Si el datoRecibido es null
                if(cs.wasNull()){
                    JOptionPane.showMessageDialog(null,"Respusta Nula");
                }
                else{
                    JOptionPane.showMessageDialog(null,datoRecibido);
                }
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Error en Procedimiento Almacenado.\n"+
                        e.getMessage()+"\n");
            }
        }
Todo bien hastaa esta linea...
Código:
cs.registerOutParameter(6,Types.VARCHAR);
Porque no consigo obtener el dato??? ya he realizado pruebas con menos atributos en el procedimiento y defirentes tipos de dato (varchar,text,integer)... y nada, siempre me arroja el mismo error: ([URL="http://www.flickr.com/photos/40124967@N06/4915330245/lightbox/"]imagenError[/URL])
Parameter index of * is out of range (1,0)

Les agradeceria la ayuda...
  #2 (permalink)  
Antiguo 22/08/2010, 15:45
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Ayuda Procedimiento Almacenado MySQL-Java

Hola,

Cita:
Iniciado por marioaguirre Ver Mensaje
cs.registerOutParameter(6,Types.VARCHAR);
Posiblemente, el parámetro es el 1 en salida, aunque sea el 6 en entrada; aunque no estoy seguro porque yo, personalmente, prefiero usar los nombres de los campos.

Código:
...
cs.registerOutParameter("_textoValidacion",Types.VARCHAR);
datoRecibido = cs.getString("_textoValidacion");
...
Prueba a cambiar el getString() por el número 1 o poner el nombre del parámetro,
Saludos,
  #3 (permalink)  
Antiguo 22/08/2010, 17:43
 
Fecha de Ingreso: febrero-2009
Mensajes: 16
Antigüedad: 15 años, 2 meses
Puntos: 0
Respuesta: Ayuda Procedimiento Almacenado MySQL-Java

Pues sigue estando raro esto...

Lo probe como mencionaste y aparecia un null
Depués lo que hice fue poner el procedimiento almacenado de esta forma:
Código:
CREATE PROCEDURE ValidarPrgramas_IN2(     
           OUT textoValidacion   varchar(20)
     )
BEGIN
       SELECT 'HOLA MUNDO' INTO textoValidacion;
END;
Simpleee sin nada más.

Depués en Java:
Código:
private void insertandoDatos() {
            String $sql= "{call ValidarPrgramas_IN2 (?)}";
            Connection con = null;
            CallableStatement cs = null;
            String datoRecibido = "";
            try {
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/OrganizandoProgramas","monty","Abc321");
                cs = (CallableStatement) con.prepareCall($sql);
//                cs.setString(1,txt_ArchivoPrograma.getText());
//                cs.setString(2,txt_NombrePrograma.getText());
//                cs.setString(3,cmb_CategoriaPrograma.getSelectedItem().toString());
//                cs.setDouble(4,Double.parseDouble(txt_VersionPrograma.getText()));
//                cs.setString(5,txa_DescripcionPrograma.getText());
                System.out.println("uno");
                try {
                    cs.registerOutParameter("textoValidacion",Types.VARCHAR);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
                System.out.println("dos");
                cs.execute();
                System.out.println("tres");
                datoRecibido = cs.getString("textoValidacion");
                System.out.println(datoRecibido);
                //Si el datoRecibido es null
                if(cs.wasNull()){
                    JOptionPane.showMessageDialog(null,"Respusta Nula");
                }
                else{
                    JOptionPane.showMessageDialog(null,datoRecibido);
                }
                cs.close();
                con.close();
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Error en Procedimiento Almacenado.\n"+
                        e.getMessage()+"\n");
            }
        }
En este catch me arrojaba un null
Código:
try {
                    cs.registerOutParameter("textoValidacion",Types.VARCHAR);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
Y si lo ponia normal, así: me arroja No value specified for parameter 1
Código:
try {
                    cs.registerOutParameter(1,Types.VARCHAR);
                } catch (Exception e) {
                    System.out.println(e.getMessage());
                }
En los 2 casos y en el último catch me arroja: Parameter index of 1 is out of range (1, 0)

Código:
catch (Exception e) {
                JOptionPane.showMessageDialog(null,"Error en Procedimiento Almacenado.\n"+
                        e.getMessage()+"\n");
            }
Cualquier otra sugerencia esta bien, lo probaré Gracias
  #4 (permalink)  
Antiguo 22/08/2010, 19:17
Avatar de HackmanC  
Fecha de Ingreso: enero-2008
Ubicación: Guatemala
Mensajes: 1.817
Antigüedad: 16 años, 2 meses
Puntos: 260
Sonrisa Respuesta: Ayuda Procedimiento Almacenado MySQL-Java

Hola,

Probé a ejecutar el código que mostraste, solamente cambiando el nombre de la base de datos, el usuario y la contraseña y me funcionó correctamente, mostrando el valor HOLA MUNDO en Java.

Lo único que cambié en MySQL fue el último ';' del stored procedure, de otra forma no acepta esa instrucción. Se me ocurre es que estés intentando crear el stored procedure de nuevo sin borrar el que ya existe y el que existe no tiene parámetros.

Cita:
Iniciado por marioaguirre Ver Mensaje
SELECT 'HOLA MUNDO' INTO textoValidacion;
END;
Intenta borrar el stored procedure anterior y volverlo a crear desde el principio.
Saludos,
  #5 (permalink)  
Antiguo 31/08/2010, 17:28
 
Fecha de Ingreso: febrero-2009
Mensajes: 16
Antigüedad: 15 años, 2 meses
Puntos: 0
Información Respuesta: Ayuda Procedimiento Almacenado MySQL-Java

Bueno... está muy raro esto porque unicamente me pasa con los OUT. Todos los IN o las inserciones al Procedimiento Almacenado son correctos, pero bueno...

No se si sea algo referente a la librería que este utilizando o la versión del MySQL


* MySQL Database Version 5.0.51b (MySQL instalado del AppServ Open Project - 2.5.10 for Windows)

* mysql-connector-java-5.1.13.jar

Código:
Class.forName("com.mysql.jdbc.Driver").newInstance();
                con = (Connection) DriverManager.getConnection("jdbc:mysql://localhost/OrganizandoProgramas","root","Abc321");
Gracias!

Etiquetas: procedimiento, almacenar
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:19.