Как мне создать хранимую процедуру, которая принимает идентификатор пользователя и возвращает полное имя и род занятий пользователя и 1 адрес электронной почты

#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 и это сработало, большое спасибо! теперь я, наконец, понимаю материал!!