發表文章

目前顯示的是有「PL/pgSQL」標籤的文章

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

PostgreSQL 的 Stored Procedure 簡易實例

增進 SQL 處理效率的一個很重要的方法就是使用 Stored Procedure ,一般商用級以上的資料庫系統都會內建這種功能。 以下是在 PostgreSQL 中建立一個 Stored Procedure 的最簡單例子: --執行結果:執行 select * from mytable where table_id = id 並回傳所有符合的資料列 CREATE OR REPLACE FUNCTION pg_myfunc(id integer) RETURNS SETOF mytable AS $BODY$DECLARE rs RECORD; BEGIN FOR rs IN select * from mytable where table_id = id LOOP RETURN NEXT rs; END LOOP; END;$BODY$ LANGUAGE 'plpgsql' VOLATILE; ALTER FUNCTION pg_myfunc(id integer) OWNER TO somebody; 如同 Oracle PL/SQL一般,PostgreSQL也有自己的程序語言 PL/pgSQL,其中最常用到的幾種語法使用: IF 判斷式 IF ... THEN ELSIF ... THEN ELSE ENDIF; FOR LOOP迴圈 FOR i IN 1 .. 10 LOOP ... END LOOP; 當找不到任何符合的資料列時 SELECT * FROM mytable WHERE mytable_id = id; IF not found THEN -- 找不到任何符合的資料列時執行這裡的程序 END IF; 全部的 Function 都建立完成了,接著就要開始使用已建立的 Stored Procedure。 執行 Functions 有兩種SQL命令可以使用: Function 沒有 回傳值時使用 SELECT pg_myfunc(); Function 有 回傳值時使用 SELECT * FROM pg_myfunc();