错误:声明返回的函数中返回类型不匹配

问题描述 投票:0回答:2

以这些表格为基础:

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"
sql function postgresql types return
2个回答
2
投票

行类型

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;

要点


0
投票

我在下面遇到了同样的错误:

错误:声明为返回整数的函数返回类型不匹配
详细信息:函数的最终语句必须是 SELECT 或 INSERT/UPDATE/DELETE RETURNING。
上下文:SQL 函数“my_func”

因为我使用

BEGIN;
COMMIT;
SQL函数中创建事务,如下所示:

CREATE FUNCTION my_func() RETURNS INTEGER AS $$
BEGIN; -- Here
SELECT 2;
COMMIT; -- Here
$$ LANGUAGE SQL;

所以我改为使用

BEGIN ATOMIC;
END;
,如下所示,然后错误就解决了。 *这仅适用于SQL函数,但不适用于PL/pgSQL函数,根据文档,您可以取消设置
LANGUAGE SQL
,默认情况下,PostgreSQL中的函数已经在单个事务中,所以我不'不需要在其中创建交易:

CREATE FUNCTION my_func() RETURNS INTEGER LANGUAGE SQL
BEGIN ATOMIC;
SELECT 2;
COMMIT;
END;

或者:

CREATE FUNCTION my_func() RETURNS INTEGER /* LANGUAGE SQL */
BEGIN ATOMIC;
SELECT 2;
COMMIT;
END;
© www.soinside.com 2019 - 2024. All rights reserved.