[RESOLVIDO] call procedure em java

2 respostas
Onimatsu
Oi pessoal. Estou tentando chamar uma procedure onde passo dois números e o retorno é a soma destes valores. O problema é que não estou conseguindo voltar com o @resultado do banco pelo resultSet dá erro: java.sql.SQLException: Can't set IN parameter for return value of stored function call. O que ficou faltando na linha 26 cs.setInt("valor_um", 1);?
create database teste_conexao;

use teste_conexao;

create table teste (
    id integer unsigned not null auto_increment,
    valor_um integer,
    valor_dois integer,
    constraint pk_id primary key (id)
);

delimiter <<
create procedure sp_soma(valor_um integer, valor_dois integer)
begin
	set @resultado = valor_um + valor_dois;
	select @resultado as msg;
end; <<
package dao;

import conexao.ConnectionFactory;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Types;
import java.util.logging.Level;
import java.util.logging.Logger;

public class TesteDAO {

    private final Connection connection;

    public TesteDAO() {
       connection = new ConnectionFactory().getConnection();
    }

    public void soma() {
        ResultSet rs;
        CallableStatement cs;
        try {
            cs = connection.prepareCall("{? = call sp_soma(?,?)}");
            // setando parâmetros
            cs.setInt("valor_um", 1);
            cs.setInt("valor_dois", 2);
            // registrando o parâmetro da variável de retorno
            cs.registerOutParameter(1, Types.INTEGER);
            // executando a procedure
            cs.execute();            
            // mostrando o @resultado
            rs = (ResultSet) cs.getObject(1);
            while (rs.next()){
                System.out.println(rs.getInt(1));
            }
            rs.close();
            cs.close();
        } catch (SQLException ex) {
            Logger.getLogger(TesteDAO.class.getName()).log(Level.SEVERE, null, ex);
        } 
    }

}

2 Respostas

drsmachado

Veja, você não vai definir qual o parâmetro de retorno na invocação da procedure.
Apenas os parâmetros de entrada.
Só depois de executar a procedure é que você, através do ResultSet, obtém o retorno.

cs = connection.prepareCall("call sp_soma(?,?)");  
            // setando parâmetros  
            cs.setInt("valor_um", 1);  
            cs.setInt("valor_dois", 2);

Ainda com dúvidas? Veja isso.

Onimatsu

Obrigado pela ajuda.
Já tinha visto este artigo porém, um detalhe passou batido - os parâmetros de entrada e saída devem ficar no banco.
Depois que fiz as seguintes alterações o código funcionou. cs = connection.prepareCall("{call sp_soma(?,?,?)}"); // setando parâmetros cs.setInt("valor_um", 3); cs.setInt("valor_dois", 8); // registrando o parâmetro de retorno cs.registerOutParameter(3, Types.INTEGER); // executando a procedure cs.execute(); // mostrando o resultado System.out.println(cs.getObject(3));delimiter << create procedure sp_soma(in valor_um integer, in valor_dois integer, out resultado integer) begin set resultado = valor_um + valor_dois; select resultado as msg; end; <<

Criado 22 de maio de 2014
Ultima resposta 22 de mai. de 2014
Respostas 2
Participantes 2