分享製作給 ...對於想了解PostgreSQL Transaction 或是進階開發 Java EE 有關 JTA 的新人,建議必要對該內容有個初步的認識.(點圖大放後再保存)
更新:2007-09-09 對映章節: 內容: 使用 PL/pgSQL 不外乎就是撰寫資料庫的預儲程序(Stored Procedure)、函數(Function)、觸發器(Trigger) 等。設計這些內部程序,其中除了迴圈、真假值判斷、回傳等等特別需求的語法外,主要的內容還是由各種 SQL 查詢命令或是呼叫其他已存在的函數所構成。由於使用 PL/pgSQL 呼叫其他函數或執行SQL命令時,多半是要等待回傳值、資料列並更進一步處理,所以與平時用前端程式或SQL命令列對函數與SQL指令的操作上,有比較不同的習慣性用法。要了解在 PL/pgSQL 處理各種呼叫查詢,必須從回傳值處理的角度去深入。 以下是幾個常用處理函數和SQL命令回傳值的方法: 將回傳資料列指向 rs 變數﹝將 rs 定義為 record 類型﹞ SELECT * INTO rs FROM mytable;
增進 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 '
在資料整理時,我們常碰到有些資料需要往前移動,有些則要往後移動,尤其在資料的顯示流程規劃上就常常要使用到這種 功能。可是傳統資料庫的排序功能,不外乎就是使用日期、時間、資料編號做為排序依據,然後利用 ORDER BY 命令達成資料排序的目的,除此之外,我們無法動態調整資料列的先後次序。 一種解決辦法是為每個資料列增加新的欄位﹝例子中取名為mytable_after﹞,用來記錄該筆資料列的前一筆資料編號。所以我們在讀取資料時就使用該欄位記錄的值,逐一列出每筆資料。操作流程大致上是: 讀取第一筆資料 A﹝mytable_after 為 0﹞ → 讀取欄位 mytable_after = A 的第二筆資料 B→ 重覆操作直到找不到下一筆資料 此方法讀取過程繁複,若交由外部程式去做,將會不停的發送 SELECT 命令給 SQL Server,可想而之,其效能必定差矣。所以,我們可以建立
Trigger - 觸發器,與交易資料鎖定一樣,是商用資料庫系統不可或缺的重要功能之一。你可曾要插入資料到資料庫的時候,同時又需要連帶更新其他表單的資料?在過去,你一定也是在前端應用程式,使用 INSERT INTO 然後再用 UPDATE,或是用一句句的 INSERT 命令來完成這任務。許多諸如此類的同步操作,假若都在資料庫系統外一步步下達命令完成,不僅是程式設計上繁複,效能上也不彰。觸發器的功能就是為了解決這類問題而設計的,當你更新或查詢某個資料表時會觸動觸發器,觸發器就會照您所設計的流程,同步去插入、更新、刪除其他資料,你不再需要重復下達多次的 SQL命令就能達成一連串資料的同步處理。 深入了解觸發器函數之前,如果能有個情境會比較好了解其中運作,你可以先想像一下有兩個資料表 mytable 和 mytable_counter 還有其中的各項欄位如下: mytable - 客戶清單
資料分頁的功能常見於 Web 應用程式,許多人應該對這功能的程式撰寫不陌生,本文嘗試利用 Stored Procedure 的方式完成這工作,我們將在 PostgreSQL 內部建立一個 Function 做 SELECT 並預先處理分頁,最後再輸出給前端程式。 PostgreSQL 資料分頁 Stored Procedure 實作例子: CREATE OR REPLACE FUNCTION mytable_list(ps bigint, page bigint) RETURNS SETOF mytable AS $BODY$DECLARE rs mytable; BEGIN FOR rs IN select * from mytable LIMIT ps OFFSET ps*(page-1) LOOP RETURN NEXT rs; END LOOP;
- Page 1 of 1 ( 6 posts )
- pgsql









