#mysql #sql #stored-procedures
#mysql #sql #хранимые процедуры
Вопрос:
delimiter $$
create procedure userInformation(in uID varchar(50), out fullname varchar(50), out job varchar(50), out email varchar(50))
begin
select concat(firstname, ' ', lastname) into FULLNAME
from users
where userid = uID;
select occupation into JOB
from occupation
join users on users.occupationID = occupation.occupationid
where userid = uID;
select useremail into EMAIL from useremail
join users on useremail.userid = users.userid
where userid = uID
limit 1;
END$$
delimiter ;
call userInformation('00002380-3e3b-11e3-bbac-c42c03098f6c', @fullnam, @job, @email);
select @fullname, @job, @email;
Я получаю эту ошибку, когда пытаюсь вызвать / выбрать процедуру;
Столбец ‘userid’ в предложении where неоднозначен.
Комментарии:
1. Спасибо за правильное форматирование, пытался выяснить, где его отредактировать @Gordon Linoff
2. у вас есть
userid
столбец в нескольких таблицах, используйте имена таблиц для решения этой проблемы, это третий выбор3. Двусмысленность здесь,
join users on useremail.userid = users.userid where userid = uID
. Не имеет отношения к вашему вопросу, но, если у buddy более одной учетной записи электронной почты, вы выбираете случайную. Это может быть не очень хорошей идеей.
Ответ №1:
При написании кода в MySQL действуют три правила:
- Всегда указывайте имена столбцов в запросах.
- Всегда различайте имена параметров по соглашениям об именовании.
- Всегда различайте локальные переменные с помощью соглашений об именовании.
Итак, я бы написал код, более похожий на этот:
create procedure userInformation (
in in_uID varchar(50),
out out_fullname varchar(50),
out out_job varchar(50),
out out_email varchar(50)
)
begin
select concat(u.firstname, ' ', u.lastname)
into out_fullname
from users u
where u.userid = in_uID;
select o.occupation
into out_job
from occupation o join
users u
on u.occupationID = o.occupationid
where u.userid = in_uID;
select ue.useremail
into out_email
from useremail ue JOIN
users u
on ue.userid = u.userid
where ue.userid = in_uID
limit 1;
end$$
Комментарии:
1. это почти сработало, пришлось изменить «where o.userid = in_uID на where o.occupationid
2. Неизвестный столбец ‘o.userid’ в ‘where clause’ — это то, что я получаю при вводе этого кода, если изменение iget равно нулю в заданиях
3. Таблица занятий не имеет идентификатора пользователя (имеет идентификатор занятия); таблица users имеет идентификатор пользователя, как и таблица useremail
4. Изменил o.userid на u.userid и это сработало, большое спасибо! теперь я, наконец, понимаю материал!!