PL/pgSQL:呼叫函數、SQL查詢與回傳值處理
使用 PL/pgSQL 不外乎就是撰寫資料庫的預儲程序(Stored Procedure)、函數(Function)、觸發器(Trigger) 等。設計這些內部程序,其中除了迴圈、真假值判斷、回傳等等特別需求的語法外,主要的內容還是由各種 SQL 查詢命令或是呼叫其他已存在的函數所構成。由於使用 PL/pgSQL 呼叫其他函數或執行SQL命令時,多半是要等待回傳值、資料列並更進一步處理,所以與平時用前端程式或SQL命令列對函數與SQL指令的操作上,有比較不 同的習慣性用法。要了解在 PL/pgSQL 處理各種呼叫查詢,必須從回傳值處理的角度去深入。
以下是幾個常用處理函數和SQL命令回傳值的方法:
- 將回傳資料列指向 rs 變數﹝將 rs 定義為 record 類型﹞
SELECT * INTO rs FROM mytable;
然後可讀取回傳資料列的各欄位內容:
rs.id
rs.name
rs.address
...
註:此 SELECT INTO 使用方法很特別,並非是你想的那樣,請參考下文說明。 - 只回傳單獨欄位內容並指向 addr 變數﹝將 addr 定義成與 address 欄位類型相同﹞
SELECT address INTO addr FROM mytable; - 拋棄所有查詢和函數的回傳值
EXECUTE myfunction();
PERFORM myfunction();
註:EXECUTE 和 PERFORM 的詳細差異不在本文討論範圍,請參考官方說明文件。
一般來說,在 PL/pgSQL 之中我們還是可以照常使用 SELECT、UPDATE、DELETE 等指令,差別在於執行查詢命令時『有無回傳值』。另外,以下有幾點,是使用 PL/pgSQL 呼叫及執行任何 SQL 命令時該注意的重點:
任何命令所回傳的值不能隨便忽略
在 過去使用前端外部程式去執行 SQL 命令,你可以忽略不管回傳值的問題,就算有回傳任何資料,我們也可以省略不處理它;但在 PL/pgSQL 中就有所不同了,尤其在『觸發器(Trigger) 』函數的設計中,更是不可放任回傳值不處理,所以,通常在觸發器中我們如果要拋棄回傳值,請使用 PERFORM 。
SELECT INTO 的不同
在 PL/pgSQL 與平時使用 SELECT INTO 是完全不同的意義,後者是建立一個新的資料表,並將所查尋到的數個資料列寫入此資料表。而在 PL/pgSQL 中只是取得查詢資料列到自訂變數之中,並不會建立新的資料表。
留言
張貼留言