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