Ver Mensaje Individual
  #1 (permalink)  
Antiguo 05/08/2013, 20:20
bibliotecario08
 
Fecha de Ingreso: agosto-2013
Ubicación: d.f.
Mensajes: 38
Antigüedad: 11 años, 4 meses
Puntos: 0
Pregunta problema procedimiento almacenado

saludos amigos soy nuevo en el foro y quisiera exponer mi duda a ver si pueden ayudarme, no se si valla en esta seccion o en otra pero yo a mi parecer siento que va mas enfocada en este espacio:

hace tiempo me dejaron una practica de diseñar una aplicacion en java para ingresar datos a traves de una interfas grafica la cual hice con net beans 7.3.1 la base de datos la hice con postgres, la base si me conecta con la aplicacion este es mi codigo de la conexion:

Código:
//variables para la conexion y para el 
    //llamado de procedimientos
    private Connection conexion;
    public Statement sentencia;
    public ResultSet resultado;
    public CallableStatement procedimiento;
  
    //metodo para conectar a la base de datos
    public void ConectarPostgres(){
      try {
           //contiene el controlador para la base de datos
           final String CONTROLADOR = "org.postgresql.Driver";
           Class.forName( CONTROLADOR );
            
           //contiene la ruta donde esta guardada la base de datos asi como su nombre
           final String RUTA_BD ="jdbc:postgresql://localhost:5432/salario_trabajador";
            
           //establece la conexion con la base de datos indicando la ruta
           //el usuario y la contraseña para poder conectarse
           conexion = DriverManager.getConnection(RUTA_BD,"postgres","root");
           sentencia = conexion.createStatement();
       }//termina try
       catch (ClassNotFoundException ex) {
           JOptionPane.showMessageDialog(null,"Error Carga Driver");
           System.exit(1);
       }//termina catch
       catch (SQLException ex1) {
           JOptionPane.showMessageDialog(null,"Error Creacion Statement");
           System.exit(1);
       }//termina catch 
  }//termina metodo ConectarPostgres
como puedeb ver es un metdo el cual yo lo coloco en el constructor de la aplicacion para que cuando se inicie la aplicacion el constructor ejecute la funcion y pueda conectar a la base de datos esto si lo hace de echo hice unos procedimientos almacenados para consultas y si me retorna los valores, ahora este es mi codigo del procedimiento almacenado en postgres:

Código:
CREATE OR REPLACE FUNCTION insertar(id integer, nombre character, pago integer)
  RETURNS void AS
'insert into salarios (id_salario,nombre,salario) values (id,nombre,pago);'
  LANGUAGE sql VOLATILE
  COST 100;
ALTER FUNCTION insertar(integer, character, integer)
  OWNER TO postgres;
este codigo estoy seguro en un 100% que si funciona ya que desde el gestor de la base de datos ejecute un par de veces el procedimiento ingresado valores y si los inserta en la tabla ahora el codigo del boton de insertar en mi aplicativo java:

Código:
try{
             
             int id;
             String nombre;
             int salario;
             
             id=Integer.parseInt(txtId.getText());
             nombre=txtNombre.getText();
             salario=Integer.parseInt(txtSalario.getText());
                     
             
             //prepara la funcion a ejecutar 
             procedimiento=conexion.prepareCall("{call insertar(?,?,?)}");
             //ejecuta la funcion
             procedimiento.setInt("id", id);
             procedimiento.setString("nombre", nombre);
             procedimiento.setInt("pago", salario);
             
             procedimiento.execute();
          }//termina try
          catch(Exception e){
             JOptionPane.showMessageDialog(null,"Error");
          }//termina catch
como pueden ver y por lo que pude investigar ya que no encontre mucha informacion solo algunos ejemplos los datos los obtengo de las cajas de texto luego parceo el id y el salario ya que no numericos y el de nombre queda tal cual por que es texto, tambien investigue que para llamar procedimientos almacenados se utiliza la libreria de "import java.sql.CallableStatement;" en conjunto con la variable de conexiony el metodo de prepareCall asi como la sintaxis que se manda como argumento de dicha funcion para llamar al procedimiento al yo ingresar los datos en las cajas y presionar el boton se ejecuta el codigo y deberia de insertar los datos pero no lo hace me marca el mensaje de error ¿que estoy haciendo mal?, ¿acaso me faslta algo? he estado investigando y eso pero no encuentro nada que me pueda ayudar a solucionar este problema asi que puedo suponer que mi parseo de los datos pudiera estar mal y puede que no coincida con el tipo de dato que reuiera el procedimiento almacenado, espero que puedan ayudarme, como ultima cosa coloco el codigo de la creacion de la tabla salario hay esta el tipo de dato de cada campo, igual pudiera ser eso ¿ustedes que opinan?

Código:
CREATE TABLE salarios
(
  id_salario integer NOT NULL,
  nombre character(25),
  salario integer,
  CONSTRAINT salarios_pkey PRIMARY KEY (id_salario)
)
__________________
"benditos sean todos los libros, pues cuando abres uno, te sumerges en un mundo nuevo y totalmente diferente..."