先看基本的语法:
NameCREATE FUNCTION
CREATE [ OR REPLACE ] FUNCTION
name( [ [argmode] [argname]argtype[ { DEFAULT | = }default_expr] [, ...] ] )
[ RETURNSrettype
| RETURNS TABLE (column_namecolumn_type[, ...] ) ]
{ LANGUAGElang_name
| WINDOW
| IMMUTABLE | STABLE | VOLATILE
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| COSTexecution_cost
| ROWSresult_rows
| SETconfiguration_parameter{ TOvalue| =value| FROM CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH (attribute[, ...] ) ]
给一个参考链接函数语法详细说明
但是我看了这个语法之后有点一头雾水,毕竟定义里的东西比较全面,很多用不到。所以写一个简单的理解和小例子来解释一下。
首先说明我的需求:我希望将某一个点的横纵坐标逐渐递加使之变为覆盖一个区域的坐标集合,同时将这些经纬度插入到数据库。比如说从(0,0)开始,以0.1递加到(1,1)。显然这是一个双重循环,先x方向递加,到达界值y加上一个精度值,再接着循环。
CREATE OR REPLACE FUNCTION createdata (maxnum INTEGER)
RETURNS void AS $BODY$
DECLARE longtude FLOAT ;
DECLARE latitude FLOAT ;
DECLARE i INTEGER ;
DECLARE j INTEGER ;
BEGIN
j := 0 ;
i := 0 ;
FOR i IN 0..10 LOOP
j = 0 ;
FOR j IN 0..20 LOOP
maxnum = maxnum + 1 ;
INSERT INTO MYTABLENAME (
"x",
"y",
"id"
)
VALUES
(
x,
y,
maxnum,
) ;
x= x+ 0.2 ;
END loop ;
x= 110.0 ;
y=y+0.2;
END loop ;
END ;
$BODY$ LANGUAGE plpgsql;
SELECT
createdata (1929)
逻辑是不是很简单。有几个点需要稍微注意下:
(1)定义的变量使用时不需要引号,直接使用就可以;
(2)创建好的函数可以在数据库里的函数中查看。
(3)本来觉的挺难的,结果一写又觉得好简单~果然实践是最好课堂