【问题标题】:PostgreSQL function with select returning one value选择返回一个值的 PostgreSQL 函数
【发布时间】:2014-05-06 17:43:39
【问题描述】:

我有一张桌子years(每只耳朵的 1 月 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');

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

【问题讨论】:

  • 那么,你使用 Oracle 还是 Postgresql?
  • @Guneli:我用的是Postgresql

标签: sql postgresql plpgsql sql-function


【解决方案1】:

您的代码有不止一个问题,但主要错误是错误地使用了 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;

这些一行函数不应该在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;

关于 PL/pgSQL 的良好来源与 PostgreSQL 文档中的 chapter 相关。第二个来源可以是我的tutorial。

【讨论】:

    【解决方案2】:

    @Pavel 所说的。另外,根据您的描述,您根本不需要函数。

    我想创建一个函数,它需要每一年并运行一个 查询另一个表以计算属于该年份的行数。

    “属于一年”似乎意味着“重叠的时间范围”。使用带有JOIN、智能连接条件和聚合的简单查询。

    假设这张表(问题中缺少):

    CREATE TABLE years (
      the_date date PRIMARY KEY
    );
    

    这个查询可以完成这项工作:

    SELECT the_date, count(*) AS row_ct
    FROM   years y
    JOIN   other_table o ON (y.the_date, y.the_date + interval '1 year')
                   OVERLAPS (o.valid_from, COALESCE(o.valid_to, 'infinity'))
    GROUP  BY 1;
    

    关于OVERLAPS 运算符:

    The manual about 'infinity'.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2012-05-30
      • 2017-10-18
      • 1970-01-01
      • 1970-01-01
      • 2011-05-16
      • 2010-09-15
      相关资源
      最近更新 更多