Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
每行的Postgresql函数_Sql_Function_Postgresql_Parameters - Fatal编程技术网

每行的Postgresql函数

每行的Postgresql函数,sql,function,postgresql,parameters,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 are

我目前正在学习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
还有这样一个函数:

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
我这样称呼它:

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
我得到的结果如下:

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
这表明area函数正在工作,但它只使用表中的第一个条目,而不使用相应的行。我做错了什么。提前谢谢

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;
然后在您的查询中:

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

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

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

   select width * length;

$area$ language sql;

它可以是纯SQL。

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

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

   select width * length;

$area$ language sql;

它可以是纯SQL。

这更有效:

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

  • 无SQL计算
  • 不可变函数不能修改数据库,并且保证在给定相同参数的情况下永远返回相同的结果。此类别允许优化器在查询使用常量参数调用函数时对其进行预评估。例如,像SELECT这样的查询。。。其中,x=2+2可以在看到时简化,以选择。。。其中x=4,因为整数加法运算符下面的函数被标记为不可变。(见附件)

这样效率更高:

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

  • 无SQL计算
  • 不可变函数不能修改数据库,并且保证在给定相同参数的情况下永远返回相同的结果。此类别允许优化器在查询使用常量参数调用函数时对其进行预评估。例如,像SELECT这样的查询。。。其中,x=2+2可以在看到时简化,以选择。。。其中x=4,因为整数加法运算符下面的函数被标记为不可变。(见附件)

假设函数“知道”它在一行中,因此使用该行<代码>不正确。函数独立于行,您必须将行中的值“传递”到该函数中。虽然这可能只是一个简单的例子,但您不需要为此使用函数,您应该直接在查询中使用(width*length),看看我做错了什么。因此,一般来说,最好为函数发送一个
pk
,并在其中添加一个
WHERE
为什么使用
从矩形中选择宽度、长度、(长度*宽度)作为区域??这不是实现
函数的好情况
“因此一般来说…”嗯,
不是真的,
下面的示例函数都从长度或宽度的任何物理实现中“提取”面积计算,因此该函数可以在任何相关情况下使用。如果一个函数基于PK,那么该函数只能在一种情况下使用。还要注意的是,在下面的示例函数中,它们不需要使用
select
,因为您传递的是已选择的长度和宽度。传递pk需要另一个select,这不是很好。您假设函数“知道”它在一行中,因此使用该行<代码>不正确。
函数独立于行,您必须将行中的值“传递”到该函数中。虽然这可能只是一个简单的例子,但您不需要为此使用函数,您应该直接在查询中使用(width*length),看看我做错了什么。因此,一般来说,最好为函数发送一个
pk
,并在其中添加一个
WHERE
为什么使用
从矩形中选择宽度、长度、(长度*宽度)作为区域??这不是实现
函数的好情况
“因此一般来说…”嗯,
不是真的,
下面的示例函数都从长度或宽度的任何物理实现中“提取”面积计算,因此该函数可以在任何相关情况下使用。如果一个函数基于PK,那么该函数只能在一种情况下使用。还要注意的是,在下面的示例函数中,它们不需要使用
select
,因为您传递的是已选择的长度和宽度。通过pk需要另一次选择,这不是很好。