1. 程式人生 > 其它 >PostgreSQL 儲存過程 通過設定條件,返回指定的資料表記錄

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