PostgreSQL 不只會「講」SQL!來認識一下:PL/pgSQL(Procedural Language/PostgreSQL Structured Query Language),這是 PostgreSQL 內建的程序語言。它就是為了讓你用 SQL 查詢配合流程控制(像 IF、CASE 條件,還有 LOOP、FOR、WHILE 迴圈)來簡化複雜操作而生的。
PL/pgSQL 跟 SQL,就像自動化生產線跟傳統「手動」工具(像鐵鎚)一樣。SQL 就像鐵鎚,超可靠,但每一下都要自己動手敲。PL/pgSQL 就像自動化生產線:你只要設定好流程,剩下的它自己來——自動執行指令、記住狀態、檢查有沒有出錯,出錯還能繼續。你還要自己一根一根釘釘子嗎?直接看它自動搞定不是更爽嗎?這不就是夢想嗎?
PL/pgSQL 跟一般 SQL 查詢的比較
來看看 PL/pgSQL 跟單純 SQL 查詢到底差在哪。
SQL 超適合做單一任務:比如查出所有學生、或新增一筆資料。但只要你遇到「如果這樣就那樣」的邏輯,或是要重複做一樣的事,SQL 就開始卡卡的了。
比如說,假設你要:
- 檢查資料表裡有沒有這個學生的紀錄。
- 如果有——就更新資料。
- 如果沒有——就新增一筆。
用一般 SQL 你得寫好幾個查詢,還要在 client 端自己處理結果。用 PL/pgSQL,這些都能包進一個 procedure,直接在資料庫端搞定。
PL/pgSQL 在複雜一點的專案超好用。它可以:
- 把中間結果存到變數裡;
- 處理錯誤,讓資料庫遇到突發狀況不會「掛掉」;
- 用迴圈和條件來跑複雜演算法。
PL/pgSQL 的應用場景
PL/pgSQL 很常見於這些情境:
自動化任務。 比如每次資料更新時自動寫一筆 log(
log)紀錄。商業邏輯。 你有個規則:每個曠課超過 5 次的學生要自動標記成「非活躍」。這種規則直接寫進 PL/pgSQL function 不就好了?
分析和報表。 不用把資料來回搬到 client app,直接在 server 端彙總就好。
觸發器。 PL/pgSQL 常拿來寫 trigger,像是自動在插入、更新或刪除資料時做某些事。
PL/pgSQL 的使用範例
來看個 function 範例,接收兩個數字,相加後回傳結果:
CREATE FUNCTION add_numbers(a INT, b INT) RETURNS INT AS $$
BEGIN
RETURN a + b;
END;
$$ LANGUAGE plpgsql;
說明:
CREATE FUNCTION add_numbers(a INT, b INT)— 我們建立一個叫add_numbers的 function,接收兩個INT(整數)參數。RETURNS INT— 表示這個 function 會回傳一個整數。BEGIN ... END— 這是主要的指令區塊,function 的邏輯都寫這裡。RETURN a + b;— 把相加的結果回傳。
要呼叫這個 function,就用一般 SQL 查詢:
SELECT add_numbers(10, 20);
結果:30。
陷阱與限制
PL/pgSQL 很強大,但還是要小心:
- 效能: function 太複雜會拖慢資料庫速度。記得測試和優化。
- 測試: function 出錯有時不會馬上發現,直到你真的呼叫它。記得寫測試!
- 可讀性: function 和 procedure 太大、邏輯太複雜會很難懂。寫 code 要想著一個月後自己還看得懂。
現在你已經大致知道 PL/pgSQL 是啥了,接下來我們會聊它的語法和主要功能。之後會學怎麼寫 code block、宣告變數、還有怎麼用各種資料型別。來吧,開始資料庫端的程式設計!
GO TO FULL VERSION