Ошибка при вызове хранимой процедуры через JDBC: No value specified for parameter 1

Ну или я тупой , или что то не так.

Делал по этому гайду

Маленькая программка, да с хранимой процедурой, казалось бы, элементарная.

Код классов прилагается. Прошу помочь, так как у меня уже 2 раз такая беда с этим автором, код мой и его совпадает, но у меня, по классике, почему то не работает :D

MainClass:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Date;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.Types;

import javax.imageio.ImageIO;

import java.sql.Driver;


public class mainClass {
    public static void main(String[] args) {
        System.out.println("Тест подключения к БД");
        String userName="root";
        String password="pass";
        String connectionUrl = "jdbc:mysql://localhost:3306/test";
    
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            Connection connection = DriverManager.getConnection(connectionUrl,userName,password);
            Statement statment = connection.createStatement();
            System.out.println("Коннект");
            statment.executeUpdate("drop table IF EXISTS Book;");
            statment.executeUpdate("create table Book ( id int not null auto_increment,cnt int, name VARCHAR(100) not null, primary key (id));");
    
            statment.executeUpdate("insert into Book(name)values('Kniga1');");
            statment.executeUpdate("insert into Book(name)values('Kniga1');");
    
            System.out.println("Добавили 2 книги");
            CallableStatement callStat = connection.prepareCall("{call testPr(?)}");
            System.out.println("Добавили вызов отложки");
            callStat.registerOutParameter(1,Types.INTEGER);//тут ошибка,первый параметр
            System.out.println("Рег аут параметра инт");
            callStat.execute();
            System.out.println("Екзекут успех");
            System.out.println(callStat.getInt(1));
            System.out.println("--------------------");

            System.out.println("Успех!");
        } catch (Exception d) {
            System.out.println(d);
        }
    }
}

SQL файл,с запросом :

create procedure testPr(OUT cnt INT)
begin 
    select count(*) into cnt from Book;
end 

Ответы (1 шт):

Автор решения: Serodv

Добавьте вот такой фрагмент кода:

System.out.println("Коннект");
// create stored procedure
statment.executeUpdate("drop procedure IF EXISTS testPr;");
statment.executeUpdate("create procedure testPr(OUT cnt INT) " +
                       "begin " +
                       "    select count(*) into cnt from Book; " +
                       "end ;");
// 
statment.executeUpdate("drop table IF EXISTS Book;");

Если заработает - то в базе сидела некорректная процедура.

→ Ссылка