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);?
packagedao;importconexao.ConnectionFactory;importjava.sql.CallableStatement;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Types;importjava.util.logging.Level;importjava.util.logging.Logger;publicclassTesteDAO{privatefinalConnectionconnection;publicTesteDAO(){connection=newConnectionFactory().getConnection();}publicvoidsoma(){ResultSetrs;CallableStatementcs;try{cs=connection.prepareCall("{?=callsp_soma(?,?)}");// setando parâmetroscs.setInt("valor_um",1);cs.setInt("valor_dois",2);// registrando o parâmetro da variável de retornocs.registerOutParameter(1,Types.INTEGER);// executando a procedurecs.execute();// mostrando o @resultadors=(ResultSet)cs.getObject(1);while(rs.next()){System.out.println(rs.getInt(1));}rs.close();cs.close();}catch(SQLExceptionex){Logger.getLogger(TesteDAO.class.getName()).log(Level.SEVERE,null,ex);}}}
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.
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; <<