PostgreSQL 存储过程 通过设定条件,返回指定的数据表记录
PL/pgSQL是 PostgreSQL 数据库系统的一个可装载的过程语言。
PL/pgSQL的设计目标是创建一种可装载的过程语言,可以可用于创建函数和触发器过程, 在SQL语言中添加控制结构功能, 能够进行复杂的计算, 继承所有用户自定义类型,函数和操作符, 能够定义被服务器信任(的语言), 容易使用。
用PL/pgSQL创建的函数可以用在内置函数用的任何地方,例如,可以创建复杂的计算函数,并之后用它们来定义操作符或者在索引表达式中使用它们。
(PL/pgSQL - SQL存储过程语言:https://wiki.postgresql.org/wiki/9.1%E7%AC%AC%E4%B8%89%E5%8D%81%E4%B9%9D%E7%AB%A0)
示例1.
1 --通过唯一ID,获取数据表记录 2 CREATE OR REPLACE FUNCTION getRealUsers() 3 RETURNS SETOF t_user 4 LANGUAGE 'plpgsql' 5 AS $BODY$ 6 declare 7 mysql text; 8 idx integer; 9 10 js_id text; 11 12 user_info t_user; 13 14 user_refcursor refcursor; --多游标 15 begin 16 idx := 0; 17 mysql:='SELECT * FROM public.t_user ORDER BY js_id'; 18 19 open user_refcursor for execute mysql; --打开游标 20 loop --开始循环 21 fetch user_refcursor into user_info; --将游标指定的值赋值给变量 22 23 if found then --处理逻辑 24 --raise notice 'delete_flag: %',user_info.delete_flag; 25 --raise notice 'js_id: %',user_info.js_id; 26 if idx = 0 then 27 js_id := user_info.js_id; 28 if user_info.delete_flag = 'f' then 29 return next user_info; 30 end if; 31 else 32 if js_id = user_info.js_id then 33 if user_info.delete_flag = 'f' then 34 return next user_info; 35 end if; 36 else 37 js_id := user_info.js_id; 38 if user_info.delete_flag = 'f' then 39 return next user_info; 40 end if; 41 end if; 42 end if; 43 idx := idx + 1; 44 else 45 exit; 46 end if; 47 end loop; --结束循环 48 close user_refcursor; --关闭游标 49 end; 50 $BODY$;
示例2.
1 --通过最新时间,获取数据表记录 2 CREATE OR REPLACE FUNCTION getRealUsers() 3 RETURNS SETOF t_user 4 LANGUAGE 'plpgsql' 5 AS $BODY$ 6 declare 7 mysql text; --SQL 8 js_id text; --ID 9 user_info t_user; --数据表对象 10 user_refcursor refcursor; --多游标 11 begin 12 js_id := ''; 13 mysql:='SELECT * FROM public.t_user ORDER BY js_id ASC, update_datetime DESC'; 14 15 open user_refcursor for execute mysql; --打开游标 16 loop -- Start 17 fetch user_refcursor into user_info; --把游标的记录设定到用户情报 18 19 if found then 20 --把最新的ID记录留下 21 if js_id != user_info.js_id then 22 js_id := user_info.js_id; 23 return next user_info; 24 end if; 25 else 26 exit; 27 end if; 28 end loop; -- End 29 close user_refcursor; --关闭游标 30 31 end; 32 $BODY$;
调用:
1 -- select * from t_user 2 select * from getRealUsers() --跟数据表一样使用
End