Stored procedure com MYSQL no Java

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.