存儲過程教程

 

存儲過程教程(一)

   在大型數據庫系統中,存儲過程和觸發器具有很重要的作用。無論是存儲過程還是觸發器,都是SQL 語句和流程控制語句的集合。就本質而言,觸發器也是一種存儲過程。存儲過程在運算時生成執行方式,所以,以後對其再運行時其執行速度很快。SQL Server 2000 不僅提供了用戶自定義存儲過程的功能,而且也提供了許多可作爲工具使用的系統存儲過程。

12.1.1 存儲過程的概念
存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL 語句集,經編譯後存儲在數據庫。中用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

    在 SQL Server 的系列版本中存儲過程分爲兩類:系統提供的存儲過程和用戶自定義存儲過程。系統過程主要存儲在master 數據庫中並以sp_爲前綴,並且系統存儲過程主要是從系統表中獲取信息,從而爲系統管理員管理SQL Server 提供支持。通過系統存儲過程,MS SQL Server 中的許多管理性或信息性的活動(如瞭解數據庫對象、數據庫信息)都可以被順利有效地完成。儘管這些系統存儲過程被放在master 數據庫中,但是仍可以在其它數據庫中對其進行調用,在調用時不必在存儲過程名前加上數據庫名。而且當創建一個新數據庫時,一些系統存儲過程會在新數據庫中 被自動創建。用戶自定義存儲過程是由用戶創建並能完成某一特定功能(如查詢用戶所需數據信息)的存儲過程。在本章中所涉及到的存儲過程主要是指用戶自定義 存儲過程。

12.1.2 存儲過程的優點
    當利用MS SQL Server 創建一個應用程序時,Transaction-SQL 是一種主要的編程語言。若運用Transaction-SQL 來進行編程,有兩種方法。其一是,在本地存儲Transaction- SQL 程序,並創建應用程序向SQL Server 發送命令來對結果進行處理。其二是,可以把部分用Transaction-SQL 編寫的程序作爲存儲過程存儲在SQL Server 中,並創建應用程序來調用存儲過程,對數據結果進行處理存儲過程能夠通過接收參數向調用者返回結果集,結果集的格式由調用者確定;返回狀態值給調用者,指 明調用是成功或是失敗;包括針對數據庫的操作語句,並且可以在一個存儲過程中調用另一存儲過程。

    我們通常更偏愛於使用第二種方法,即在SQL Server 中使用存儲過程而不是在客戶計算機上調用Transaction-SQL 編寫的一段程序,原因在於存儲過程具有以下優點:

(1) 存儲過程允許標準組件式編程
存儲過程在被創建以後可以在程序中被多次調用,而不必重新編寫該存儲過程的SQL 語句。而且數據庫專業人員可隨時對存儲過程進行修改,但對應用程序源代碼毫無影響(因爲應用程序源代碼只包含存儲過程的調用語句),從而極大地提高了程序的可移植性。

(2) 存儲過程能夠實現較快的執行速度
如 果某一操作包含大量的Transaction-SQL 代碼或分別被多次執行,那麼存儲過程要比批處理的執行速度快很多。因爲存儲過程是預編譯的,在首次運行一個存儲過程時,查詢優化器對其進行分析、優化,並 給出最終被存在系統表中的執行計劃。而批處理的Transaction- SQL 語句在每次運行時都要進行編譯和優化,因此速度相對要慢一些。

(3) 存儲過程能夠減少網絡流量
對 於同一個針對數據數據庫對象的操作(如查詢、修改),如果這一操作所涉及到的 Transaction-SQL 語句被組織成一存儲過程,那麼當在客戶計算機上調用該存儲過程時,網絡中傳送的只是該調用語句,否則將是多條SQL 語句,從而大大增加了網絡流量,降低網絡負載。

(4) 存儲過程可被作爲一種安全機制來充分利用
系統管理員通過對執行某一存儲過程的權限進行限制,從而能夠實現對相應的數據訪問權限的限制,避免非授權用戶對數據的訪問,保證數據的安全。(我們將在14 章“SQLServer 的用戶和安全性管理”中對存儲過程的這一應用作更爲清晰的介紹)

注意: 存儲過程雖然既有參數又有返回值,但是它與函數不同。存儲過程的返回值只是指明執行是否成功,並且它不能像函數那樣被直接調用,也就是在調用存儲過程時,在存儲過程名字前一定要有EXEC保留字

 

存儲過程教程(二)

在MS SQL Server 2000 中,創建一個存儲過程有兩種方法:一種是使用Transaction-SQL 命令Create Procedure, 另一種是使用圖形化管理工具Enterprise Manager。 用Transaction- SQL 創建存儲過程是一種較爲快速的方法,但對於初學者,使用Enterprise Manager 更易理解,更爲簡單。
當創建存儲過程時,需要確定存儲過程的三個組成部分;

  • 所有的輸入參數以及傳給調用者的輸出參數。
  • 被執行的針對數據庫的操作語句,包括調用其它存儲過程的語句;
  • 返回給調用者的狀態值,以指明調用是成功還是失敗。

12.2.1 使用Enterprise Manager 創建存儲過程
按照下述步驟用Enterprise Manager 創建一個存儲過程:

  • 啓動Enterprise Manager, 登錄到要使用的服務器。
  • 選擇要創建存儲過程的數據庫,在左窗格中單擊Stored Procedure 文件夾,此時在右窗格中顯示該數據庫的所有存儲過程,如圖12-1 所示。
  • 右擊Stored Procedure 文件夾,在彈出菜單中選擇New Stored Procedure, 此時打開創建存儲過程對話框,如圖12-2 所示。

  • 輸入存儲過程正文。
  • 單擊Check Syntax, 檢查語法是否正確。
  • 單擊OK, 保存。
  • 在右窗格中,右擊該存儲過程,在彈出菜單中選擇All task, 選擇ManagePermissions, 設置權限,如圖12-3 所示。

12.2.2 用CREATE PROCEDURE 命令創建存儲過程
通過運用Create Procedure 命令能夠創建存儲過程,在創建存儲過程之前,應該考慮到以下幾個方面:

  • 在一個批處理中,Create Procedure 語句不能與其它SQL 語句合併在一起;
  • 數據庫所有者具有默認的創建存儲過程的權限,它可把該權限傳遞給其它的用戶;
  • 存儲過程作爲數據庫對象其命名必須符合命名規則;
  • 只能在當前數據庫中創建屬於當前數據庫的存儲過程。

用Create Procedure 創建存儲過程的語法規則如下:
CREATE PROC [ EDURE ] procedure_name [ ; number ]
[ { @parameter data_type }
[ VARYING ] [ = default ] [ OUTPUT ]
] [ ,...n ]
[ WITH
{ RECOMPILE | ENCRYPTION | RECOMPILE , ENCRYPTION } ]
[ FOR REPLICATION ]
AS sql_statement [ ...n ]

各參數的含義如下:

  • procedure_name
    是要創建的存儲過程的名字,它後面跟一個可選項number, 它是一個整數,用來區別一組同名的存儲過程。存儲過程的命名必須符合命名規則,在一個數據庫中或對其所有者而言,存儲過程的名字必須惟一。
  • @parameter
    是 存儲過程的參數。在Create Procedure 語句中,可以聲明一個或多個參數。當調用該存儲過程時,用戶必須給出所有的參數值,除非定義了參數的缺省值。若參數的形式以 @parameter=value 出現,則參數的次序可以不同,否則用戶給出的參數值必須與參數列表中參數的順序保持一致。若某一參數以@parameter=value 形式給出,那麼其它參數也必須以該形式給出。一個存儲過程至多有1024 個參數。
  • Data_type
    是參數 的數據類型。在存儲過程中,所有的數據類型包括text 和image 都可被用作參數。但是,遊標cursor 數據類型只能被用作OUTPUT 參數。當定義遊標數據類型時,也必須對VARING 和OUTPUT 關鍵字進行定義。對可能是遊標型數據類型的OUTPUT 參數而言,參數的最大數目沒有限制。
  • VARYING
    指定由OUTPUT 參數支持的結果集,僅應用於遊標型參數。
  • Default
    是指參數的缺省值。如果定義了缺省值,那麼即使不給出參數值,則該存儲過程仍能被調用。缺省值必須是常數,或者是空值。
  • OUTPUT
    表明該參數是一個返回參數。用OUTPUT 參數可以向調用者返回信息。Text 類型參數不能用作OUTPUT 參數。
  • RECOMPILE
    指明SQL Server 並不保存該存儲過程的執行計劃,該存儲過程每執行一次都又要重新編譯。
  • ENCRYPTION
    表明SQL Server 加密了syscomments 表,該表的text 字段是包含有Create procedure語句的存儲過程文本,使用該關鍵字無法通過查看syscomments 表來查看存儲過程內容。
  • FOR REPLICATION
    選項指明瞭爲複製創建的存儲過程不能在訂購服務器上執行,只有在創建過濾存儲過程時(僅當進行數據複製時過濾存儲過程才被執行),才使用該選項。FOR REPLICATION與WITH RECOMPILE 選項是互不兼容的。
  • AS
    指明該存儲過程將要執行的動作。
  • Sql_statement
    是任何數量和類型的包含在存儲過程中的SQL 語句。

另外應該指出,一個存儲過程的最大尺寸爲128M, 用戶定義的存儲過程必須創建在當前數據庫中。
 下面將給出幾個例子,用來詳細介紹如何創建包含有各種保留字的存儲過程。

發佈了42 篇原創文章 · 獲贊 3 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章