У меня есть хранимая процедура в mysql 8.0.20 со следующим кодом:
create
definer = root@localhost procedure CreateUser(IN data json)
BEGIN
declare idUser_in int unsigned;
declare firstName_in varchar(45) default null;
declare lastName_in varchar(45) default null;
declare email_in varchar(55) default null;
declare enabled_in tinyint default 0;
declare idRole_in int unsigned;
# declare jwtSecret_in varchar(255);
declare mobilePhone_in varchar(15);
declare telephone_in varchar(15);
declare password_in varchar(255);
declare salt_in varchar(255);
declare pin_in varchar(8);
declare username_in varchar(55);
set idUser_in = null;
set firstName_in = json_unquote(json_extract(data, '$.firstName'));
set lastName_in = json_unquote(json_extract(data, '$.lastName'));
set email_in = json_unquote(json_extract(data, '$.email'));
set enabled_in = json_unquote(json_extract(data, '$.enabled'));
set idRole_in = json_unquote(json_extract(data, '$.idRole'));
# set jwtSecret_in = json_unquote(json_extract(data, '$.jwtSecret'));
set telephone_in = json_unquote(json_extract(data, '$.telephone'));
set mobilePhone_in = json_unquote(json_extract(data, '$.mobilePhone'));
set password_in = json_unquote(json_extract(data, '$.password'));
set salt_in = json_unquote(json_extract(data, '$.salt'));
set pin_in = json_unquote(json_extract(data, '$.pin'));
set username_in = json_unquote(json_extract(data, '$.username'));
insert into User (firstName, lastName, email, username, enabled, telephone, mobilePhone, idRole, password, salt, pin)
values (firstName_in, lastName_in, email_in, username_in, enabled_in, telephone_in, mobilePhone_in, idRole_in, password_in, salt_in, pin_in);
select LAST_INSERT_ID();
END;
Я выполняю вышеуказанную процедуру с go, используя следующую команду:
byteUser, err := json.Marshal(*user)
response, queryError := tx.Exec("call CreateUser(?)", string(byteUser))
Вставка в дБ выполнена успешно.
Однако при попытке получить последний вставленный идентификатор с помощью команды:
id, err = response.LastInsertId()
всегда возвращает 0.
Если я выполняю процедуру, используя следующий код я получаю последний вставленный идентификатор правильно, но я не получаю эту ошибку для отката ()
var id int64
response:= tx.QueryRow("call CreateUser(?)", string(byteUser))
err = response.Scan(&id)
Таким образом я получаю правильный последний вставленный идентификатор ...
Есть предложения? Каков наилучший способ вызова хранимых процедур из go / sql ??