PostgreSQL函数,select返回一个值

Luc*_*ion 0 sql postgresql plpgsql sql-function

我有一张桌子years(每只耳朵的1号).我想创建一个函数,它接受这些年中的每一年并在另一个表上运行查询来计算属于该年份的行数.我尝试用pl/pgsql实现,使用下面的代码,但我没有让它工作或在Internet上找到任何引用.

CREATE or REPLACE FUNCTION func_test(in AAA date, OUT _result int) 
BEGIN
   SELECT SUM(st_length(geom)) as BBB
   FROM hist_line
   WHERE '2006-01-01' BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
   RETURN _result BBB;
END;
$$ LANGUAGE plpgsql;
CREATE or REPLACE FUNCTION func_test(date) 

select func_test('2009-01-01');
Run Code Online (Sandbox Code Playgroud)

我无法将函数内部的内容查询恢复为函数的输出.

Pav*_*ule 7

您的代码有多个问题,但主要错误是错误地使用SELECT语句 - 您做什么没有意义.plpgsql中的嵌入式SQL有特殊条款"INTO targetvar":

CREATE OR REPLACE FUNCTION func_test(in AAA date, OUT _result int)
AS $$
BEGIN
   SELECT SUM(st_length(geom)) INTO _result
      FROM hist_line
     WHERE AAA BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
   RETURN;
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

这两行函数不应该在plpgsql中实现.只需使用SQL.

CREATE OR REPLACE FUNCTION func_test(in AAA date)
RETURNS int AS $$
   SELECT SUM(st_length(geom)) 
      FROM hist_line
     WHERE $1 BETWEEN valid_from AND COALESCE(valid_to, '9999-12-31');
$$ LANGUAGE sql;
Run Code Online (Sandbox Code Playgroud)

关于PL/pgSQL的良好来源是PostgreSQL文档中的相关章节.第二个来源可以是我的教程.