我尝试在 postgres 中声明简单的函数,但我无法让它工作。它看起来像这样:
CREATE OR REPLACE FUNCTION test2(rok int, id int)
RETURNS int AS $$
BEGIN
select sum(data_zakonczenia-data_rozpoczecia) from historia where id_eksponatu = $2 AND data_rozpoczecia>DATE(to_char($1,'9999') || '-01-01') AND data_zakonczenia<DATE(to_char($1+1,'9999') || '-01-01');
END;
$$ LANGUAGE 'plpgsql';
出现以下错误
ERROR: query has no destination for result data
PODPOWIEDŹ: If you want to discard the results of a SELECT, use PERFORM instead.
KONTEKST: PL/pgSQL function "test2" line 2 at SQL statement
我不确定如何让它工作。
最佳答案
你想要一个 SQL 函数:
CREATE OR REPLACE FUNCTION test2(rok int, id int)
RETURNS int AS
$$
select sum(data_zakonczenia-data_rozpoczecia)
from historia where id_eksponatu = $2
AND data_rozpoczecia>DATE(to_char($1,'9999') || '-01-01')
AND data_zakonczenia<DATE(to_char($1+1,'9999') || '-01-01');
$$ LANGUAGE sql;
或者如果你出于某种原因需要PL/pgSQL,你需要使用return query
CREATE OR REPLACE FUNCTION test2(rok int, id int)
RETURNS int AS $$
BEGIN
return query
select sum(data_zakonczenia-data_rozpoczecia)
from historia where id_eksponatu = $2
AND data_rozpoczecia>DATE(to_char($1,'9999') || '-01-01')
AND data_zakonczenia<DATE(to_char($1+1,'9999') || '-01-01');
END;
$$ LANGUAGE plpgsql;
或者如果您需要在返回之前对值做一些事情:
CREATE OR REPLACE FUNCTION test2(rok int, id int)
RETURNS int AS $$
declare
l_sum integer;
BEGIN
select sum(data_zakonczenia-data_rozpoczecia)
into l_sum
from historia where id_eksponatu = $2
AND data_rozpoczecia>DATE(to_char($1,'9999') || '-01-01')
AND data_zakonczenia<DATE(to_char($1+1,'9999') || '-01-01');
....
return l_sum;
END;
$$ LANGUAGE plpgsql;
语言名称是一个标识符。不要将其放在单引号中。
关于postgresql - 简单的 postgres 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50746060/