在數據庫中如何使用存儲過程

1存儲過程

使用的大多數SQL語句都是針對一個或多個表的單條語句。並非所有操作都這麼簡單,經常會有一個完整的操作需要多條語句才能完成。那怎麼編寫代碼呢?

可以創建存儲過程。存儲過程簡單來說,就是爲以後的使用而保存的一條或多條MySQL語句的集合。可將其視爲批文件,雖然它們的作用不僅限於批處理

2爲什麼要使用存儲過程

  • 通過把處理封裝在容易使用的單元中,簡化複雜的操作(正如前面例子所述)。
  • 由於不要求反覆建立一系列處理步驟,這保證了數據的完整性。如果所有開發人員和應用程序都使用同一(試驗和測試)存儲過程,則所使用的代碼都是相同的。

這一點的延伸就是防止錯誤。需要執行的步驟越多,出錯的可能性就越大。防止錯誤保證了數據的一致性。

  • 簡化對變動的管理。如果表名、列名或業務邏輯(或別的內容)有變化,只需要更改存儲過程的代碼。使用它的人員甚至不需要知道這些變化。

這一點的延伸就是安全性。通過存儲過程限制對基礎數據的訪問減少了數據訛誤(無意識的或別的原因所導致的數據訛誤)的機會。

  • 提高性能。因爲使用存儲過程比使用單獨的SQL語句要快。
  • 存在一些只能用在單個請求中的MySQL元素和特性,存儲過程可以使用它們來編寫功能更強更靈活的代碼(在下一章的例子中可以看到。)

總的來說,存儲過程有3個主要的好處,簡單、安全、高性能

在將SQL代碼轉換爲存儲過程前,也必須知道它的一些缺陷

  • 一般來說,存儲過程的編寫比基本SQL語句複雜,編寫存儲過程需要更高的技能,更豐富的經驗。
  • 不同的DBMS的存儲過程語法有所不同

3執行存儲過程

存儲過程的執行遠比其定義更經常遇到,因此,我們將從執行存儲過程開始介紹。然後再介紹創建和使用存儲過程。
執行存儲過程的SQL語句很簡單,即EXECUTE。EXECUTE接受存儲過程名和需要傳遞給它的任何參數。
實例說話:

EXECUTE AddNewProduct( 'JTS01',  
                       'Stuffed Eiffel Tower',  
                       6.49, 
                       'Plush stuffed toy with the text La 
➥Tour Eiffel in red white and blue' );

分析:這裏執行一個名爲AddNewProduct的存儲過程,將一個新產品添加到Products表中。AddNewProduct有四個參數,分別是:供應商ID(Vendors表的主鍵)、產品名、價格和描述。這四個參數匹配存儲過程中四個預期變量(定義爲春初過程自身的組成部分)。此存儲過程將新行添加到Products 表中,並將傳入的屬性賦給相應的列

在Products表中還有另一個需要值得列prod_id列,它是這個表的主鍵。
因爲要保證恰當的生成此ID,最好是生成此ID的過程自動化(而不依賴於最終用戶的輸入),所以這個值不作爲屬性傳遞給存儲過程。

以下是存儲過程完成的工作:
1. 驗證傳遞的數據,保證傳遞的四個參數都有值。
2. 生成用作主鍵的唯一ID。
3. 將新產品插入Products表,在合適的列中存儲生成的主鍵和傳遞的數據。

這就是存儲過程執行的基本形式

具體的DBMS包含以下執行選擇:

  1. 參數可選,具體不提供參數時的默認值
  2. 不按次序給出參數,以“參數-值”的方式給出參數值
  3. 輸出參數,允許存儲過程在執行的應用程序中更新所用的參數
  4. 用SELECT語句檢索數據
  5. 返回代碼,允許存儲過程返回一個值到正在執行的應用程序

4創建存儲過程

存儲過程編寫很重要,先看一個簡單的例子,對郵件發送清單中具有郵件地址的顧客進行計數。
以下是SQL Server的版本

CREATE PROCEDURE MailingListCount
AS 
DECLARE @cnt INTEGER 
SELECT @cnt = COUNT(*) 
FROM Customers 
WHERE NOT cust_email IS NULL; 
RETURN @cnt; 

分析
此存儲過程沒有參數。調用 程序檢索SQL Server的返回代碼提供的值。其中DECLARE語句聲明瞭一個名爲@cnt的局部變量(SQL Server中所有局部變量都以@ 起頭);然後在SELECT語句中使用變量,讓它包含COUNT()函數返回的值;最後,用RETURN@cnt語句將計數返回給調用程序。

調用SQL Server例子可以像下面這樣

DECLARE @ReturnValue INT 
EXECUTE @ReturnValue=MailingListCount; 
SELECT @ReturnValue; 

分析:這段代碼聲明瞭一個變量來保存存儲過程返回的任何值,然後執行存儲過程,在使用SELECT語句顯示返回的值。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章