Вызов процедуры, в которой есть INSERT-запрос, не создаёт никаких записей MySQL
У меня есть такая процедура (точнее, как я её создал):
DELIMITER //
CREATE PROCEDURE registerUser (IN ip VARCHAR(100), IN world VARCHAR(100), IN countryCode VARCHAR(45), IN nick VARCHAR(100))
BEGIN
INSERT INTO `donations` VALUES (NULL, 5000, 100, 16, 0, 0, 0, 0, 0, 0, 3);
SET @don_id = last_insert_id();
INSERT INTO `telemetry` VALUES (NULL, ip, world, countryCode, CURRENT_TIMESTAMP, 0);
INSERT INTO `users` VALUES (NULL, nick, @don_id, CURRENT_TIMESTAMP, last_insert_id());
END//
Теперь, я её хочу вызвать из-под Java. Вот так:
private void registerUserInDatabaseIfNotExists(ServerPlayerEntity player) {
try {
Connection connection = MySQLConnection.getPool().getConnection();
PreparedStatement req = connection.prepareStatement("SELECT COUNT(*) FROM `users` WHERE `nickname` = ?;");
req.setString(1, player.getName().getString());
ResultSet rs = req.executeQuery();
rs.next();
if (rs.getInt("COUNT(*)") == 0) { // Если записи не существует, то надо выполнить процедуру
logger.info("Registering a new user: " + player.getName().getString());
CallableStatement statement = connection.prepareCall("{CALL registerUser(?, ?, ?, ?)}");
statement.setString(1, player.getIp());
statement.setString(2, ((WorldNameGetter) player.world).getName());
statement.setString(3, "RU");
statement.setString(4, player.getName().getString());
req.execute();
statement.close();
logger.info("Player successfully registered!");
connection.close();
}
} catch (Exception ex) {
player.networkHandler.disconnect(new LiteralText("Произошла ошибка при обработке вашего соединения! " +
"Попробуйте подключиться позднее.").formatted(Formatting.RED));
logger.error("Error while process joining player " + player.getName().getString());
logger.throwing(Level.ERROR, ex);
} // Здесь простые действия на случай ошибок.
}
И самая главная проблема в том, что этот вызов не создаёт ВООБЩЕ никаких записей, а попытка вызвать её через statement.executeUpdate() вызывает ошибку: Throwing java.sql.SQLException: Can not issue executeUpdate() or executeLargeUpdate() with statements that produce result sets
Как это исправить?
Ответы (1 шт):
Автор решения: Денис Орлов
→ Ссылка
В общем, я разобрался. Тут очень тупая ошибка была: я вызывал не statment.execute(), а req.execute(). Вывод: Надо более внимательно следить за переменными.