postgresql從入門到菜鳥(四)pl/pgsql過程語言
阿新 • • 發佈:2018-12-18
之前介紹了一些postgresql資料庫的配置,以及視窗函式的使用。
這一次準備說一些pl/pgsql過程語言方面的東西。
pl/pgsql主要的功能是對sql進行擴充套件,讓sql可以實現,邏輯判斷,迴圈等功能。
首先說說優點,我個人理解使用過程語言最大的優點就是減少了客戶端與服務端之間的通訊消耗。
以一個使用者登入的功能為例:
假設登入功能實現的方式為,首先判斷使用者是否存在,如果不存在,向用戶返回使用者不存在的訊息,如果使用者存在,再進行使用者名稱密碼是否匹配的判斷。
這時使用者登入就分為的兩種情況
場景1.客戶端訪問服務端判斷使用者是否存在(發生第一次通訊連線),使用者不存在,返回客戶端相應訊息。
場景2.客戶端訪問服務端判斷使用者是否存在(發生第一次通訊連線),使用者存在,判斷使用者名稱密碼是否匹配(發生第二次通訊連線),判斷後返回相應訊息。
在場景2中,共發生了兩次通訊,那麼有沒有辦法使這個業務在一次通訊中就完成呢,這個時候過程語言就派上了用場。
先看看基本語法:
create or replace function 函式名(引數型別)returns 返回型別 as $$
declare:
定義引數
引數名 引數型別 :=引數初始值;
begin
方法體
return 引數型別;
end;$$
language plpgsql STABLE SECURITY DEFINER;
然後再看需求(一個登陸驗證函式):
函式名:userlogin_check()
引數:uname varchar,pwd varchar
功能:先判斷使用者是否存在,存在的場合再判斷密碼是否正確
返回值:result int
有了以上條件似乎寫一個驗證函式似乎也不那麼難
create or replace function userlogin_check(uname varchar,pwd varchar) returns int as $$
declare -- 變數申明
_uname varchar;
_passwd varchar;
_result int := -100;
BEGIN -- 開始
SELECT password INTO _passwd
FROM users
WHERE username = uname; -- 根據使用者名稱查詢密碼
if found then -- 如果查詢到資料,說明使用者存在,判斷密碼正確性
if _passwd = pwd then
_result := 0; -- 成功登入
else
_result := -2; -- 使用者名稱密碼不匹配
end if;
else --如果沒有查詢到資料,說明使用者不存在
_result := -1; -- 使用者不存在
end if;
return _result;
EXCEPTION WHEN OTHERS THEN --異常處理
raise notice 'exception in userlogin_check: %, %', SQLSTATE, SQLERRM;
return _result;
END; --結束
$$
LANGUAGE plpgsql STABLE SECURITY DEFINER;
將以上內容儲存為.sql檔案後在psql命令中通過/i匯入,或者直接在psql命令執行以上內容後即可通過select userlogin_check(‘smoon’,’1234’);方式呼叫,並根據返回值判斷登入結果。
通過這種方式在場景2可以減少一次通訊連線,在更加複雜的業務中則可以減少的則更多。