postgresql最近真是如日中天,很多小伙伴纷纷转型,我也是其中一员,介于工作性质同oracle dba的不同,pg在走国产化的道路中,导致pg dba必须要会写function ,从而替代 oracle中的procedure,最近我也把我自己整理和系统学习的干货分享给大家。
什么是function?要注意哪些?
SQL函数包体是一些可执行的SQL语言。同时包含1条以上的查询,但是函数只返回最后一个查询(必须是SELECT)的结果。language sql !!
除非SQL函数声明为返回void,否则最后一条语句必须是SELECT
在简单情况下,返回最后一条查询结果的第一行。
如果最后一个查询不返回任何行,那么该函数将返回NULL值。
如果需要该函数返回最后一条SELECT语句的所有行,可以将函数的返回值定义为集合,即SETOF sometype。
()中的变量是输入变量,可以定义输出变量
returns 为输出结果的返回值类型
$$内为实际的逻辑操作,符号可加可不加
language sql 为定义基于sql的function
language plpgsql 为定义基于存储过程的function
声明函数
示例:
CREATE OR REPLACE FUNCTION add(a NUMERIC, b NUMERIC)RETURNS NUMERICAS $$SELECT a+b;$$ LANGUAGE SQL;
显示结果:
vastbase=# select add(1,3);add-----4
(1 row)
未声明函数
示例
CREATE OR REPLACE FUNCTION add3(NUMERIC,NUMERIC)RETURNS NUMERICAS $$SELECT $1 + $2;$$ LANGUAGE SQL;
显示结果
select add2(1,100);add2------101(1 row)
另外一种写法(可读性不强):
create or replace function add4 (a numeric,b numeric)returns numeric as 'select a+b'language sql;
显示结果:
select add4(1,5);add4------6(1 row)
前面说的都是定义的输入变量,如果定义中包含输出变量,则不需要return type。
示例:
create or replace function add5(in a numeric,in b numeric,out c numeric)as $$select a+b;$$ language sql;
结果:
vastbase=# select add5(2,5);add5------7(1 row)
如果存在多个sql语句,则返回的就是最后一个sql语句,之前的sql语句都会执行,但是不会被返回
示例:
创建表;
vastbase=# create table t(id int);CREATE TABLEvastbase=#vastbase=# insert into t select generate_series(1,10);INSERT 0 10vastbase=# select * from t;id----12345678910(10 rows)
创建function add_upd_del
create function add_upd_del (a numeric,b numeric)returns numeric as $$select a+b;update t set id=100 where id=1;select a-b;$$ language sql;或者 add_upd_del1create or replace function add_upd_del1 (in a numeric, in b numeric, out c numeric)as $$select a+b;update t set id=200 where id=2;select a-b;$$ language sql;
add_upd_del结果
vastbase=# select add_upd_del(1,3);add_upd_del--------------2(1 row)vastbase=# select * from t;id-----2345678910100(10 rows)
add_upd_del1结果
vastbase=# select add_upd_del1(4,3);add_upd_del1--------------1(1 row)vastbase=# select * from t;id-----345678910100200(10 rows)
上面所述,最后一行sql function的最后一行必须是select语句,除非returns的值是void(空类型)
create or replace function del_fun()returns void as $$delete from t where id = 100;$$ language sql;
结果:
vastbase=# select del_fun();del_fun---------(1 row)vastbase=# select * from t;id-----345678910200(9 rows)
返回一个查询集合,关键字setof
create or replace function sel_fun1()returns setof varchar as $$select name from t1;$$ language sql;
结果
vastbase=# select sel_fun1();sel_fun1----------aaabbbcccdddeee(5 rows)
如果returns的类型是varchar
create or replace function sel_fun()returns varchar as $$select name from t1;$$ language sql;
结果:只会显示第一条表中数据
vastbase=# select sel_fun();sel_fun---------aaa
THAT'S ALL

BY CUI PEACE!!!




