CodeGym /課程 /SQL SELF /認識 PL/pgSQL

認識 PL/pgSQL

SQL SELF
等級 49, 課堂 0
開放

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 就開始卡卡的了。

比如說,假設你要:

  1. 檢查資料表裡有沒有這個學生的紀錄。
  2. 如果有——就更新資料。
  3. 如果沒有——就新增一筆。

用一般 SQL 你得寫好幾個查詢,還要在 client 端自己處理結果。用 PL/pgSQL,這些都能包進一個 procedure,直接在資料庫端搞定。

PL/pgSQL 在複雜一點的專案超好用。它可以:

  • 把中間結果存到變數裡;
  • 處理錯誤,讓資料庫遇到突發狀況不會「掛掉」;
  • 用迴圈和條件來跑複雜演算法。

PL/pgSQL 的應用場景

PL/pgSQL 很常見於這些情境:

  1. 自動化任務。 比如每次資料更新時自動寫一筆 log(log)紀錄。

  2. 商業邏輯。 你有個規則:每個曠課超過 5 次的學生要自動標記成「非活躍」。這種規則直接寫進 PL/pgSQL function 不就好了?

  3. 分析和報表。 不用把資料來回搬到 client app,直接在 server 端彙總就好。

  4. 觸發器。 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、宣告變數、還有怎麼用各種資料型別。來吧,開始資料庫端的程式設計!

2
任務
SQL SELF, 等級 49, 課堂 0
上鎖
建立一個簡單的加法函數
建立一個簡單的加法函數
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION