MySQL的存儲過程(stored procedure)和函數(stored function)統稱為stored routines。它是事先經過編譯並存儲在數據庫中的一段SQL語句的集合。
存儲過程與函數的區別
本質上沒區別。函數只能通過return語句返回單個值或者表對象。而存儲過程不允許執行return,但是通過out參數返回多個值。 函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。函數限制比較多,如不能用臨時表,只能用表變量等,而存儲過程的限制相對就比較少。
1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
2. 當對數據庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來與數據庫提供的事務處理結合一起使用。存儲過程可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句.
3. 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的后面。
4. 存儲過程只在創造時進行編譯,以后每次執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
5. 存儲過程可以接受參數、輸出參數、返回單個或多個結果集以及返回值,可以向程序返回錯誤原因。但函數只能返回一個特定類型的值或者表對象。
6. 存儲過程中的CRUD的操作會影響數據庫狀態,但函數卻不能。
7. 函數只能是in類型,存儲過程可以使用In\out\inout類型。
還有一些其他的區別:
Functions ----------
1) can be used with Select statement
2) Not returning output parameter but returns Table variables
3) You can join UDF
4) Cannot be used to change server configuration
5) Cannot be used with XML FOR clause
6) Cannot have transaction within function
Stored Procedure -----------------
1) have to use EXEC or EXECUTE
2) return output parameter
3) can create table but won’t return Table Variables
4) you can not join SP
5) can be used to change server configuration
6) can be used with XML FOR Clause
7) can have transaction within S
存儲過程和函數定義的區別
存儲過程:可以使得對的管理、以及顯示關於及其用戶信息的工作容易得多。存儲過程是SQL語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。存儲過程存儲在數據庫內,可由應用程序通過一個調用執行,而且允許用戶聲明變量、有條件執行以及其它強大的編程功能。存儲過程可包含程序流、邏輯以及對數據庫的查詢。它們可以接受參數、輸出參數、返回單個或多個結果集以及返回值。
函數:是由一個或多個SQL語句組成的子程序,可用於封裝代碼以便重新使用。自定義函數諸多限制,有許多語句不能使用,許多功能不能實現。函數可以直接引用返回值,用表變量返回記錄集。但是,用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。函數有三種不同的類型:
- Scalar-valued function - returns a scalar value such as an integer or a timestamp. Can be used as column name in queries
- Inline function - can contain a single SELECT statement.
- Table-valued function - can contain any number of statements that populate the table variable to be returned. They become handy when you need to return a set of rows, but you can't enclose the logic for getting this rowset in a single SELECT statement.
兩者聲明的區別
存儲過程和函數的具體操作可參考:mysql中存儲過程的基本操作和mysql中函數應用實例。
存儲過程:
CREATE OR REPLACE PROCEDURE my_proc
(p_name IN VARCHAR2 := 'John') as begin ... end
函數:
CREATE OR REPLACE FUNCTION my_func
(p_name IN VARCHAR2 := 'John') return varchar2 as begin ... end
應用的區別
一般情況下,盡量避免使用table valued函數,因為會造成一定的性能影響。
轉載自:http://www.cnblogs.com/ttltry-air/archive/2012/08/19/2646262.html
參考資料:
4、Difference between Stored procedures and functions
當存儲過程和函數被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在procedure cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
Procedure cache中保存的是執行計划 (execution plan) ,當編譯好之后就執行procedure cache中的execution plan,之后SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
參考資料:http://www.cnblogs.com/kscnchina/archive/2013/03/01/2938808.html