Я новичок в MySQL и пытаюсь создать хранимую процедуру. Приведенный ниже код возвращает ошибку Error Code: 1172. Result consisted of more than one row. Что я делаю неправильно? (Я использую верстак MySQL)

CREATE DEFINER=`root`@`localhost` PROCEDURE `season_private_league_user`(
IN user_id INT,
OUT league_name VARCHAR(25),
OUT host_user VARCHAR(30))
BEGIN

    DECLARE userteamid INT;
    DECLARE var_league_name VARCHAR(25);
    DECLARE var_host_user VARCHAR(30);

    # Retrieve user team from user_id
    SELECT CS_USER_TEAMS_ID INTO userteamid
    FROM classicseasonmodel_classicseasonuserteam
    WHERE user_id = user_id;

    #LEAGUE NAME
    SELECT classicseasonmodel_classicseasonprivateleague.private_league_name INTO var_league_name
    FROM   classicseasonmodel_classicseasonuserteamprivateleague
    INNER JOIN classicseasonmodel_classicseasonprivateleague
    ON classicseasonmodel_classicseasonuserteamprivateleague.private_league_id=classicseasonmodel_classicseasonprivateleague.CS_PRIVATE_LEAGUE_ID
    WHERE  user_team_id = userteamid;

    #HOST_USER
    SELECT classicseasonmodel_classicseasonprivateleague.host_user_id INTO var_host_user
    FROM   classicseasonmodel_classicseasonuserteamprivateleague
    INNER JOIN classicseasonmodel_classicseasonprivateleague
    ON classicseasonmodel_classicseasonuserteamprivateleague.private_league_id=classicseasonmodel_classicseasonprivateleague.CS_PRIVATE_LEAGUE_ID
    WHERE  user_team_id = userteamid;

    SET league_name = var_league_name;
    SET host_user = var_host_user;

END

CALL season_private_league_user(2, @league_name, @host_user); SELECT @league_name AS league_name; SELECT @host_user AS host_user;

0
Matchday 6 Окт 2014 в 18:19

2 ответа

Лучший ответ

Имя вашего столбца и имя параметра идентичны. Переименуйте входной параметр и измените команду на это:

SELECT CS_USER_TEAMS_ID INTO userteamid
FROM classicseasonmodel_classicseasonuserteam
WHERE user_id = @user_id;
1
programmer43229 6 Окт 2014 в 14:31

Одна из хранимых процедур SELECT, которая хранит результат в переменной, возвращает более одной строки, которая возвращается в этой ошибке. Таким образом, вы можете хранить в переменной только отдельные значения, а не несколько.

Вы можете прочитать об операторе SELECT ... INTO здесь . Часть, которая может быть наиболее интересной для вас:

Выбранные значения присваиваются переменным. Количество переменных должно соответствовать количеству столбцов. Запрос должен вернуть одну строку. Если запрос не возвращает строк, появляется предупреждение с кодом ошибки 1329 (Нет данных), а значения переменных остаются неизменными. Если запрос возвращает несколько строк, возникает ошибка 1172 (результат состоит из более чем одной строки). Если возможно, что оператор может получить несколько строк, вы можете использовать LIMIT 1, чтобы ограничить набор результатов одной строкой.

1
Olli 6 Окт 2014 в 14:30