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 是完全不同的意義,後者是建立一個新...