MySQL存儲過程和函數(1) - 基礎知識

1.什麼是存儲程序?

   存儲程序Stored Routine包括存儲過程Stored Procedure和存儲函數Stored Function。下面重點介紹存儲過程。

   我們常用的操作數據庫語言SQL語句在執行的時候需要要先編譯,然後執行,而存儲過程(Stored Procedure)是一組爲了完成特定功能的SQL語句集,經編譯後存儲在數據庫中,用戶通過指定存儲過程的名字並給定參數(如果該存儲過程帶有參數)來調用執行它。

一個存儲過程是一個可編程的函數,它在數據庫中創建並保存。它可以有SQL語句和一些特殊的控制結構組成。當希望在不同的應用程序或平臺上執行相同的函數,或者封裝特定功能時,存儲過程是非常有用的。數據庫中的存儲過程可以看做是對編程中面向對象方法的模擬。它允許控制數據的訪問方式。

存儲過程是數據庫存儲的一個重要的功能,但是MySQL5.0以前並不支持存儲過程,這使得MySQL在應用上大打折扣。好在MySQL 5.0終於開始已經支持存儲過程,這樣即可以大大提高數據庫的處理速度,同時也可以提高數據庫編程的靈活性。

2.使用存儲過程有什麼好處?

   ①首先在性能上的提高,比起通過應用程序發送sql語句給數據庫執行,讓數據庫自己內部執行存儲過程效率更高、速度更快(存儲過程將sql編譯好後存在數據庫目錄下)

   ②存儲過程還減少了應用程序同服務器自己的信息交互頻率,可以想象在不是使用存儲過程的情況,應用程序需要發送多條sql指令給服務器,而使用存儲過程則只要一條調用存儲過程的語句,然後獲取需要的數據就ok了。

   ③存儲過程重用性比較高,並且是透明的,因爲保存在數據庫裏面所以對任何應用來說都可以使用。新的應用只需要調用相應的存儲過程就可以得到相應的數據服務。

   ④存儲過程也是種安全的做法,數據庫管理員可以對那些沒有權限訪問數據庫中的表格的應用,給他們使用存儲過程的權限來獲得數據服務,可以看到這個時候這些存儲過程好像我們編程裏面的接口這個概念。對於安全性要求很高的系統,例如銀行,基本上常用的操作都是通過存儲過程或者函數來進行的,這樣完全對應用隱藏了表格。


3.使用存儲過程的壞處?

   ①存儲過程會使得數據庫佔用的系統資源加大(cpumemory),數據庫畢竟主要用來做數據存取的,並不進行復雜的業務邏輯操作。

   ②因爲存儲過程依舊是sql,所以沒辦法像編程語言那樣寫出複雜業務邏輯對應的存儲過程。

   ③存儲過程不容易進行調試。

   ④存儲過程書寫及維護難度都比較大。


※理解第2、3點有助於我們按照具體需求選擇是否使用存儲過程。


4.存儲過程和函數存在以下幾個區別:

   ①一般來說,存儲過程實現的功能要複雜一點,而函數的實現的功能針對性比較強。存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作;用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。

   ②對於存儲過程來說可以返回參數,如記錄集,而函數只能返回值或者表對象。函數只能返回一個變量;而存儲過程可以返回多個。存儲過程的參數可以有IN,OUT,INOUT三種類型,而函數只能有IN~~存儲過程聲明時不需要返回類型,而函數聲明時需要描述返回類型,且函數體中必須包含一個有效的RETURN語句。

   ③存儲過程,可以使用非確定函數,不允許在用戶定義函數主體中內置非確定函數。

   ④存儲過程一般是作爲一個獨立的部分來執行( EXECUTE 語句執行),而函數可以作爲查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。 SQL語句中不可用存儲過程,而可以使用函數。


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