每行Postgresql函数

时间:2014-08-08 09:09:29

标签: sql function postgresql parameters

我目前正在学习postgresql并且有一个noob问题。如果我有这样一个简单的表:

CREATE TABLE rectangle
(
    width int,
    length int
);

这样的功能:

CREATE OR REPLACE FUNCTION Area()
RETURNS int AS $area$
declare
    area int;
BEGIN
   SELECT (width*length)  into area FROM rectangle;
   return area ;
END;
$area$ LANGUAGE plpgsql;

我称之为:

select width, length, area() from rectangle;

我得到的结果如下:

width  |  length  |  area
-------------------------
2      |     3    |    6
4      |     3    |    6
5      |     2    |    6

这表明区域功能正在运行但它只使用表中的第一个条目而不是相应的行。我究竟做错了什么。提前致谢!

3 个答案:

答案 0 :(得分:3)

CREATE OR REPLACE FUNCTION Area(integer, integer)
RETURNS int AS $area$
declare
    area int;
BEGIN
   SELECT ($1 * $2)  into area ;
   return area ;
END;
$area$ LANGUAGE plpgsql;

然后查询:

select width, length, area(width, length) from rectangle;

答案 1 :(得分:1)

在您的函数中,您将从表中的一个未确定的行中获取值。有必要将参数传递给函数

create or replace function area (
    width int, length int
) returns int as $area$

   select width * length;

$area$ language sql;

它可以是简单的SQL。

答案 2 :(得分:0)

效率更高:

CREATE OR REPLACE FUNCTION Area(integer, integer)
RETURNS int AS 
$body$
BEGIN
   return ($1 * $2) ;
END;
$body$ 
LANGUAGE plpgsql 
IMMUTABLE;

原因:

  • 没有SQL评估;
  • IMMUTABLE函数无法修改数据库,并且保证在永远给定相同参数的情况下返回相同的结果。此类别允许优化器在查询使用常量参数调用函数时预先评估函数。例如,像SELECT ... WHERE x = 2 + 2这样的查询可以简化为SELECT ... WHERE x = 4,因为整数加法运算符的基础函数被标记为IMMUTABLE。 (见more)。