PostgreSQL函数也称为PostgreSQL存储过程。 PostgreSQL函数或存储过程是存储在数据库服务器上并可以使用SQL界面调用的一组SQL和过程语句。
语法:
CREATE [OR REPLACE] FUNCTION function_name (arguments)
RETURNS return_datatype AS $variable_name$
DECLARE
declaration;
[...]
BEGIN
< function_body >
[...]
RETURN { variable_name | value }
END; LANGUAGE plpgsql;
function_name:指定函数的名称。
arguments: 函数参数
[OR REPLACE]:是可选的,它允许修改/替换现有函数。
DECLARE:定义参数(参数名写在前面 类型写在后面)。
BEGIN~END: 在中间写方法主体。
RETURN:指定要从函数返回的数据类型(它可以是基础,复合或域类型,或者也可以引用表列的类型)。
LANGUAGE:它指定实现该函数的语言的名称。 可以是SQL,PL/pgSQL,C, Python等。
你可以将 IN
参数传递给函数,但无法从返回结果里再获取到。
OUT
参数经常用于一个函数需要返回多个值,所以不需要 RETURN
语句。
INOUT
参数是 IN
和 OUT
参数的组合。这意味着调用者可以将值传递给函数,函数然后改变参数并且将该值作为结果的一部分 传递回去。
PostgreSQL
函数可以接受可变数量的参数,其中一个条件是所有参数具有相同的数据类型。参数作为数组传递给函数。
CREATE OR REPLACE FUNCTION hi_lo(
IN a NUMERIC,
IN b NUMERIC,
OUT c NUMERIC,
OUT hi NUMERIC,
INOUT lo NUMERIC)
AS $$
BEGIN
c:= GREATEST(a,b);
hi:= LEAST(a,b);
lo:=GREATEST(a,b);
END; $$
LANGUAGE plpgsql;
与 Java
等编程语言相同,PostgreSQL
允许多个函数具有相同的名称,只要参数不同即可。如果多个函数具有相同的名称,那么我们说这些函数是重载的。当一个函数被调用时,PostgreSQL
根据输入参数调用确切的函数。
一个 PostgreSQL
函数由块(block)进行组织。
[ DECLARE
声明 ]
BEGIN
主体;
...
END;
每个块有两个部分,称为声明和主体。声明部分是可选的,而主体部分是必需的。该块在END关键字后以分号(;)结尾。声明部分中的每个语句都以分号(;)结尾。 主体部分中的每个语句也以分号(;)结尾。
SELECT test(id)
test为自定义函数名称,返回函数定义的返回内容。
DO $$
DECLARE num INTEGER=0;
BEGIN
select count(*) into num as num from (select distinct cardnum from
bus_data) as A;
insert into ic_test
select num, dt
from bus_data limit 100;
END $$;
void testFun(String dtstr);
① 传入一个list,返回list的和、以及平均数
CREATE OR REPLACE FUNCTION sum_avg(
VARIADIC list NUMERIC[],
OUT total NUMERIC,
OUT average NUMERIC)
AS $$
BEGIN
SELECT INTO total SUM(list[i])
FROM generate_subscripts(list, 1) g(i);
SELECT INTO average AVG(list[i])
FROM generate_subscripts(list, 1) g(i);
END; $$
LANGUAGE plpgsql;
②计算管线是否在多边形范围内
参数:管线首尾坐标,多边形最小x,最大x,最小y,最大y
CREATE OR REPLACE function fun_isinarea(x1 numeric,y1 numeric,x2 numeric,y2 numeric,xmin numeric,xmax numeric,ymin numeric,ymax numeric)
returns BOOLEAN
as
$BODY$
declare bResult boolean=false;
begin
if((x1>=xmin and x1<=xmax) and (y1>=ymin and y1<=ymax)) then bResult=true;
end if;
if((x2>=xmin and x2<=xmax) and (y2>=ymin and y2<=ymax)) then bResult=true;
end if;
return bResult ;
end;
$BODY$
LANGUAGE plpgsql VOLATILE