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

ee7vknir  于 11个月前  发布在  PostgreSQL
关注(0)|答案(2)|浏览(188)

在这些表格的基础上:

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,该函数将返回驱动程序的namesurname,在这个特定的电路中,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”

c0vxltue

c0vxltue1#

行类型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是输入参数的错误数据类型。请使用textvarchar。详细信息:
  • 使用数据类型“text”存储字符串有什么缺点吗?
  • 比较varchar和char
  • 使用一个显式的JOIN来做同样的事情,这样更容易阅读和维护。
bogh5gae

bogh5gae2#

下面是同样的错误:
错误代码:声明为返回整数的函数中的返回类型不匹配CONTEXT:函数的最终语句必须是SELECT或SELECT/UPDATE/RETURNING。CONTEXT:SQL函数“my_func”
因为我使用START TRANSACTION;COMMIT;SQL function中创建了一个transaction,如下所示:

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

字符串
因此,我使用了BEGIN ATOMIC ... END statement,如下所示:错误已解决 * 根据the docBEGIN ATOMIC ... END语句仅适用于SQL function,而不适用于PL/pgSQL function,并且您可以在使用BEGIN ATOMIC ... END语句时取消LANGUAGE SQL,但它仍然是一个SQL函数,并且PostgreSQL中的函数默认情况下已经在单个事务中,因此我不需要在其中创建事务:

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


或者:

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

相关问题