一、簡介
存儲過程與用戶自定義函數類似,是放在服務器端數據庫中的子程序,是經編譯過的能執行特定功能的SQL語句集合,它將一些複雜的對數據庫表的操作集中起來,作爲一個單元來處理。
存儲過程可以接收和輸出參數,返回執行存儲過程的狀態值,還可以嵌套使用。用戶可以像使用函數一樣重複調用這些存儲過程,實現它所定義的操作。
存儲過程的優點主要有:
1)存儲過程只在創建時進行編譯,以後每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2)當對數據庫進行復雜操作時,可將此複雜操作用存儲過程封裝起來,與數據庫提供的事務處理結合一起使用。
3)存儲過程可以重複使用,可減少數據庫開發人員的工作量。
4)安全性高,可設定只有某此用戶才具有對指定存儲過程的使用權。
二、基本框架
CREATE OR REPLACE FUNCTION name(ids"varchar") --定義存儲過程的名字及參數
RETURNSbool AS --返回值類型
$BODY$ --主體
DECLARE --聲明所需要的變量
r RECORD;
rlt bool;
sql "varchar";
BEGIN
SQL語句;
return 1;
END;
$BODY$
LANGUAGE'plpgsql' VOLATILE;
三、步驟
1)需求分析。
對存儲過程中需要調整轉換的數據進行需求分析,確定其個數和具體內容。
(1)劃分層次。
爲了方便最終計算,可以把存儲過程劃分層次,層次結構如下:
(2)提取基礎數據(中間數據)。
劃分層次之後,結合原始數據,把計算最終數據需要的中間數據提取整理出來,放到一個數據庫表(數據閘)中,這樣,所有的最終數據的計算都從這個數據庫表中取數據。
(3)劃分存儲過程個數和內容。
存儲過程的個數要適當,不要太多,太零散,也不要太少,集成度太大的話,維護起來比較困難。
可以以具體業務模塊爲維度進行劃分,以濟鋼PDM爲例,其存儲過程劃分維度如下:
①“提取中間數據”(一個存儲過程)
②“各種報表”(每種報表一個存儲過程)
2)進行概要設計。
對前面的工作進行總結,編寫存儲過程概要設計文檔。概要設計的內容主要包括存儲過程的需求、層次結構、層次劃分、各層次間的關係、關鍵問題分析等。
3)畫系統內部數據流程圖。
存儲過程涉及的數據存儲比較複雜,寫存儲過程之前要畫好系統內部數據流程圖,可以清楚地看出數據庫內部數據的流向。
4)進行詳細設計。
根據畫好的數據流程圖,對每一個存儲過程中包含的具體內容進行詳細設計,編寫存儲過程詳細設計文檔。
詳細文檔的內容主要包括:每一個存儲過程的調用接口、名稱、傳入參數、返回值、功能及操作內容(主要包括操作數據庫的目標列名、目標表名、原列名、原列名所在的表、關鍵查詢條件)。
5)編寫代碼。
思路:(1)原始數據-->基礎數據
首先編寫由原始數據到基礎數據的存儲過程,儘量把這些操作放到一個存儲過程中,便於後期維護。
編寫時要保證數據計算存儲的正確性
(2)基礎數據-->最終數據
按照詳細文檔中的對存儲過程的設計,逐個編寫計算最終數據的存儲過程。並保證數據的計算存儲正確無誤。
4)編寫上層使用文檔。
上層使用文檔的主要內容是一系列SQL語句,這些SQL語句告知上層開發人員,每一條最終數據對應數據庫中的哪一個表、哪一個列,或是經過簡單的計算就可以由數據庫中的哪一個表、哪一個列,得到最終數據。
這樣不僅可以驗證存儲過程的正確性,而且提供給上層開發人員使用存儲過程的接口。