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包含以下執行選擇:
- 參數可選,具體不提供參數時的默認值
- 不按次序給出參數,以“參數-值”的方式給出參數值
- 輸出參數,允許存儲過程在執行的應用程序中更新所用的參數
- 用SELECT語句檢索數據
- 返回代碼,允許存儲過程返回一個值到正在執行的應用程序
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語句顯示返回的值。