postgresql - 简单的 postgres 函数

标签 postgresql

我尝试在 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/

相关文章:

postgresql - 导入后postgres无法从大表中选择

apache2 - 上传文件时无法设置正确的字符集

ruby-on-rails - 如何使用 postgres 和 ActiveRecord 检索所有重复的电子邮件

sql - 如果日期不与现有日期重叠,则将日期范围更新到日期列中

sql - PostgreSQL 忽略窗口函数中的 NULLS

vba - Access 2010访问PostgreSQL无法更新

sql - Postgresql - 如何仅在满足特定条件时插入

php - 从 Mysql 迁移到 Postgresql Yii2 查询

postgresql - 表约束中不存在 postgres 键

sql - 如何在 Postgre 中返回主列名?