基于这些表:
create table f1_driver(
code varchar(5) not null primary key,
name varchar(10),
surname varchar(20),
dateofbirth date,
debut integer,
countryoforigin varchar(20),
points integer
);
create table f1_results (
drivercode varchar(5) not null references f1_driver,
circuitcode varchar(5) not null references f1_circuit,
racedate date,
raceposition integer,
grid integer,
primary key (drivercode, circuitcode, racedate)
);
我想创建一个函数,用户将提供 circuitcode
,该函数将返回驱动程序的 name
和 surname
在这个特定的电路中,raceposition
比 grid
更好。
我这样写:
CREATE FUNCTION get(character) RETURNS SETOF f1_driver AS
$$
SELECT D.name, D.surname
FROM f1_driver D,f1_results R
WHERE R.circuitcode = $1
AND D.code=R.drivercode
AND R.raceposition<grid ;
$$ LANGUAGE SQL;
我有这个错误:
ERROR: return type mismatch in function declared to return f1_driver DETAIL: Final statement returns too few columns. CONTEXT: SQL function "get"
最佳答案
行类型 f1_driver
与您实际返回的不匹配。使用 RETURNS TABLE
提供匹配声明:
CREATE FUNCTION f_get_drivers(varchar)
RETURNS TABLE(name varchar, surname varchar) AS
$func$
SELECT D.name, D.surname
FROM f1_driver D
JOIN f1_results R ON R.drivercode = D.code
WHERE R.circuitcode = $1
AND R.raceposition < R.grid;
$func$ LANGUAGE sql;
要点
RETURNS
中声明的返回类型必须与实际返回的类型相匹配。是您输入参数的错误数据类型。使用character
text
或varchar
。详情:使用显式
JOIN
做同样的事情。这样更易于阅读和维护。
关于sql - 错误 : return type mismatch in function declared to return,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27671140/