Ошибка: ожидается меньше столбцов, чем было возвращено - PullRequest
0 голосов
/ 27 мая 2020
CREATE OR REPLACE FUNCTION get_user_info ( u_email VARCHAR, u_password VARCHAR, p_name VARCHAR )
RETURNS TABLE(
    user_id             int,                
    given_name          varchar(55),
    family_name         varchar(55),
    password            varchar(255),
    email               varchar(255),
    date_of_birth       date
)
AS $$
BEGIN
    -- If a player display player_name and team_id
    IF p_name != '' THEN
        RETURN QUERY
        SELECT player.user_id, player.given_name, player.family_name, player.password, player.email, player.date_of_birth,
        player.player_name AS player_name, player.team_id AS team_id FROM player
        WHERE player.email = u_email and player.password = u_password;
    -- If not a player then display usual table
    ELSE
        RETURN QUERY
        SELECT * FROM "user"
        WHERE "user".email = u_email and "user".password = u_password;
    END IF;
END $$
LANGUAGE plpgsql;

-- Get user info with arguments - email, password and player_name. If not a player pass '' as player_name
SELECT get_user_info('tomtom@hotmail.com', 'tommy12', 'tomkilla'); -- Player

Ошибка:

ERROR:  structure of query does not match function result type
DETAIL:  Number of returned columns (8) does not match expected column count (6).
CONTEXT:  PL/pgSQL function get_user_info(character varying,character varying,character varying) line 5 at RETURN QUERY
SQL state: 42804

Просто интересно, почему я получаю эту ошибку? Клянусь, у меня он работал раньше, но теперь это не> _>, если я использую зрителя, запрос работает

1 Ответ

1 голос
/ 27 мая 2020

Ваша функция ожидает, что будут возвращены только 6 столбцов

(
    user_id             int,                
    given_name          varchar(55),
    family_name         varchar(55),
    password            varchar(255),
    email               varchar(255),
    date_of_birth       date
)

Но ваш оператор select возвращает 8 столбцов

player.user_id, player.given_name, player.family_name, player.password, player.email, player.date_of_birth,player.player_name AS player_name, player.team_id AS team_id 

вы можете добавить эти 2 столбца в оператор return как

(
    user_id             int,                
    given_name          varchar(55),
    family_name         varchar(55),
    password            varchar(255),
    email               varchar(255),
    date_of_birth       date,
    player_name         <type>,
    team_id             <type>
)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...