Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 错误要求的列数少于返回的列数_Sql_Postgresql_Plpgsql - Fatal编程技术网

Sql 错误要求的列数少于返回的列数

Sql 错误要求的列数少于返回的列数,sql,postgresql,plpgsql,Sql,Postgresql,Plpgsql,错误: 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

错误:

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

只是想知道为什么我会犯这个错误?我发誓我以前让它工作过,但是现在它不工作了,如果我做一个旁观者,查询就工作了,你的函数只希望返回6列

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
但是select语句返回了8列

(
    user_id             int,                
    given_name          varchar(55),
    family_name         varchar(55),
    password            varchar(255),
    email               varchar(255),
    date_of_birth       date
)
您可以在return语句中添加这两列,如下所示

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 
(
用户id int,
命名为varchar(55),
姓瓦查尔(55岁),
密码varchar(255),
电子邮件varchar(255),
出生日期,
玩家姓名,
团队id
)

在else语句中,您将从users表返回所有列,您可以指定需要返回的列,否则您可能也会遇到问题。

那么,我将如何两次指定这些列呢?因为我只想在球员而不是观众的情况下展示其他两列。它们从“用户”表继承。不,您不能这样做。对于返回的动态列数,您可以从函数中返回
SETOF RECORD
,但必须在select中指定列。那么为什么“player.player\u name作为player\u name,player.team\u id作为team\u id”不起作用呢?我认为这会在psuedo列中添加内容?要实现这一点,您必须返回
记录集
而不是
。如果您想删除您的问题,请“关闭”它,但不要删除实际文本
(
    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>
)