在这些表格的基础上:
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;
型
我有这个错误:
错误:声明为返回f1_driver的函数中的返回类型不匹配
Final语句返回的列太少。
上下文:SQL函数“get”
2条答案
按热度按时间c0vxltue1#
行类型
f1_driver
与实际返回的值不匹配。请使用RETURNS TABLE
提供匹配声明:字符串
要点
RETURNS
中声明的返回类型必须与实际返回的类型匹配。character
是输入参数的错误数据类型。请使用text
或varchar
。详细信息:JOIN
来做同样的事情,这样更容易阅读和维护。bogh5gae2#
下面是同样的错误:
错误代码:声明为返回整数的函数中的返回类型不匹配CONTEXT:函数的最终语句必须是SELECT或SELECT/UPDATE/RETURNING。CONTEXT:SQL函数“my_func”
因为我使用
START TRANSACTION;
和COMMIT;
在SQL function中创建了一个transaction,如下所示:字符串
因此,我使用了BEGIN ATOMIC ... END statement,如下所示:错误已解决 * 根据the doc,
BEGIN ATOMIC ... END
语句仅适用于SQL function,而不适用于PL/pgSQL function,并且您可以在使用BEGIN ATOMIC ... END
语句时取消LANGUAGE SQL
,但它仍然是一个SQL函数,并且PostgreSQL中的函数默认情况下已经在单个事务中,因此我不需要在其中创建事务:型
或者:
型