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

posted @ 2021-10-28 16:02  ZZQJWJ  阅读(992)  评论(0编辑  收藏  举报