java.sql.SQLException: параметр номер 2 не является параметром OUT
Я получаю сообщение об ошибке при выполнении этого:
1. cs = getCon1().prepareCall("{CALL SaveLabourWageDetails(?,?)}");
2. cs.setString(1, user.getUserId());
3. cs.registerOutParameter(2, java.sql.Types.INTEGER); //<--- ERROR at this line
4. cs.execute();
5. String lastIsertId=cs.getString(2);
Хранимая процедура:
CREATE
PROCEDURE `cheque_alert`.`SaveLabourDetailsHead`(IN wage_entered_by VARCHAR(10),OUT LastInsertId INT)
BEGIN
INSERT INTO `cheque_alert`.`labour_wage_head`
(
`wage_entered_by`,
`entered_date_time`)
VALUES (wage_entered_by,
NOW());
SELECT LAST_INSERT_ID() INTO LastInsertId;
END$$
DELIMITER ;
Пожалуйста, укажите на проблему в этом коде.
5 ответов
Вы вызываете неправильную процедуру. У вас есть процедура SaveLabourDetailsHead
и ты звонишь
1. cs = getCon1().prepareCall("{CALL SaveLabourWageDetails(?,?)}");
↑
Изменить на,
1. cs = getCon1().prepareCall("{CALL SaveLabourDetailsHead(?)}");
Установить параметр String wage_entered_by
,
Ваш параметр out имеет тип String, но он должен быть int. Попробуйте это.
int lastIsertId=cs.getInt(2);
У меня была та же проблема, но исключение вывода вводит в заблуждение, поскольку основной причиной было имя процедуры.
Я ввел неверную процедуру, которой не было в базе данных.
Вместо предоставления исключения SQL типа "подпрограммы не существует" он дал:
java.sql.SQLException: Parameter number 2 is not an OUT parameter.
Просто была такая же проблема.
В моем случае это была проблема с разрешением. Пользователь MySQL, который использует мое приложение, не имеетEXECUTE
разрешение на схему, над которой я работаю.
GRANT EXECUTE ON <your_schema>.* TO '<your_user>'@'localhost';
FLUSH PRIVILEGES;
Я гонялся за этим целую вечность, а потом обнаружил, что пропустил и подчеркивание в названии хранимой процедуры! У меня даже не было процедуры с неправильным названием.
Какое глупое сообщение об ошибке!
«Параметр неправильный — ох, кстати, этой процедуры не существует»