Hola pessoal, estou com um problema na obtenção de dados de uma stored procedure feita em MySQL para o Java
A minha Stored Procedure é essa:
CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_calc_produto`( num_compra INT)
BEGIN
DECLARE preco_uni REAL;
DECLARE quant INTEGER;
DECLARE num_produto INTEGER;
START TRANSACTION;
SELECT tb_produtos_cod_produtos INTO num_produto FROM tb_compra WHERE cod_compra=num_compra;
SELECT valor_custo INTO preco_uni FROM tb_produtos WHERE cod_produtos=num_produto;
SELECT quantidade INTO quant FROM tb_compra WHERE cod_compra=num_compra;
SELECT preco_uni*quant AS preco_final;
COMMIT;
END$$
DELIMITER ;
O meu código do Java é esse:
public void teste() throws SQLException {
try {
conecta();
CallableStatement cs = conect.prepareCall("{? = call db_academia.sp_calc_produto(?)}");
//cs.registerOutParameter(1, java.sql.Types.FLOAT);
cs.setInt(2, 12);
cs.execute();
cs.registerOutParameter(1, java.sql.Types.FLOAT);
//System.out.println("Codigo da pessoa atualizada:" + cs.getFloat(1));
System.out.println("RETURN STATUS: ");
JOptionPane.showMessageDialog(null,"dados : \n"+cs.getFloat(1) );
cs.close();
}
catch(SQLException erro) {
JOptionPane.showMessageDialog(null,"Erro sql : \n"+ erro.getMessage());
}
}
O programa esta dando o seguinte erro: Parameter index out of range(2>number of parameter, which is 1)
Embora você tenha setado como 2 o parâmetro que é passado, ele ainda procura o primeiro.
cs.setInt(2, 12);
Ou você corrige a String, retirando o primeiro ? ou você passa os dois parâmetros.
public void teste() throws SQLException {
try {
conecta();
CallableStatement cs = conect.prepareCall("{call sp_calc_produto(?,?)}");
cs.setInt(1, 12);
cs.registerOutParameter(2, java.sql.Types.FLOAT);
cs.execute();
System.out.println("RETURN STATUS: ");
//JOptionPane.showMessageDialog(null,"dados : \n"+cs.getFloat(2) );
cs.close();
}
catch(SQLException erro) {
JOptionPane.showMessageDialog(null,"Erro sql : \n"+ erro.getMessage());
}
}
Agora o erro é o seguinte: parameter index of 2 is out of range (1,1).
Dizendo que o parametro 2 está fora do intervalo (1,1)
Na verdade a minha procedure tem apenas 1 parametro, não consigo colocar um parametro de saida para retornar o resultado.
andei pesquisando e consegui fazer de outra maneira:
public void teste() throws SQLException {
ResultSet r2;
try {
conecta();
CallableStatement cs = conect.prepareCall("{call sp_calc_produto(?)}");
cs.setFloat(1, 12);
cs.execute();
resultset = cs.executeQuery();
if (resultset.next()) {
float temp = resultset.getFloat(1);
System.out.println(resultset.getFloat(1));
}
else
{
System.out.println("Não foi possivel");
}
resultset.close();
//System.out.println("Codigo da pessoa atualizada:" + cs.getFloat(1));
System.out.println("RETURN STATUS: ");
//JOptionPane.showMessageDialog(null,"dados : \n"+cs.getFloat(2) );
cs.close();
}
catch(SQLException erro) {
JOptionPane.showMessageDialog(null,"Erro sql : \n"+ erro.getMessage());
}
}
Fica uma duvida no ar, por que ele não reconhece o primeiro parametro disso: {? = call sp_calc_produto(?)}
Ora, pelo simples fato de que você não estava passando nenhum parâmetro.