儲存過程和函式的區別
首先如圖所示,Oracle中的差別
儲存過程 | 函式 |
用於在資料中完成特定的操作或者任務 | 用於特定的資料 |
程式頭部申明procedure | 程式頭部申明function |
程式頭部申明時不需要描述返回型別 | 程式頭部申明時需要描述返回型別,而且PL/SQL至少要包含一個有效的return語句 |
可以使用in/out/ in out | 可以使用in/out/in out |
可作為一個獨立的PL/SQL語句來執行 | 不能立即執行,必須作為表示式的一部分 |
可以通過out.int out | 通過return語句返回一個值 |
SQL語句中不得呼叫任何儲存過程 | SQL語句中可以呼叫函式 |
SQL SERVER中:
本質上沒區別。只是函式有如:只能返回一個變數的限制。而儲存過程可以返回多個。而函式是可以嵌入在sql中使用的,可以在select中呼叫,而儲存過程不行。執行的本質都一樣。
函式限制比較多,比如不能用臨時表,只能用表變數.還有一些函式都不可用等等.而儲存過程的限制相對就比較少
1. 一般來說,儲存過程實現的功能要複雜一點,而函式的實現的功能針對性比較強。
2. 對於儲存過程來說可以返回引數,而函式只能返回值或者表物件。
3. 儲存過程一般是作為一個獨立的部分來執行,而函式可以作為查詢語句的一個部分來呼叫,由於函式
可以返回一個表物件,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當儲存過程和函式被執行的時候,SQL Manager會到procedure cache中去取相應的查詢語句,如果在
procedure cache裡沒有相應的查詢語句,SQL Manager就會對儲存過程和函式進行編譯。
Procedure cache:中儲存的是執行計劃,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中儲存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。儲存在cache中的plan在下次執行時就不用再編譯了。
儲存過程和函式具體的區別:
儲存過程:可以使得對的管理、以及顯示關於及其使用者資訊的工作容易得多。儲存過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱儲存並作為一個單元處理。儲存過程儲存在資料庫內,可由應用程式通過一個呼叫執行,而且允許使用者宣告變數、有條件執行以及其它強大的程式設計功能。儲存過程可包含程式流、邏輯以及對資料庫的查詢。它們可以接受引數、輸出引數、返回單個或多個結果集以及返回值。
可以出於任何使用 SQL 語句的目的來使用儲存過程,它具有以下優點:
(1)功能強大,限制少。
(2)可以在單個儲存過程中執行一系列 SQL 語句。
(3)可以從自己的儲存過程內引用其它儲存過程,這可以簡化一系列複雜語句。
(4)儲存過程在建立時即在上進行編譯,所以執行起來比單個SQL語句快。
(5)可以有多個返回值,即多個輸出引數,並且可以使用SELECT返回結果集。
函式:是由一個或多個 SQL 語句組成的子程式,可用於封裝程式碼以便重新使用。自定義函式諸多限制,有許多語句不能使用,許多功能不能實現。函式可以直接引用返回值,用表變數返回記錄集。但是,使用者定義函式不能用於執行一組修改全域性資料庫狀態的操作。
補充:
前面有一句,“可以處於任何使用SQL語句的目的來使用儲存過程”。這裡想說的是,有些時候有些地方使用函式或許會更方便些。例如,存在這樣一個表:Temperature(Year, Month, Day, T02, T08, T14, T20),其中Year,Month,Day是時間欄位,T02, T08, T14, T20是指2時、8時、14時、20時四個時刻對應的溫度值,這些溫度值可為空。現在,要求統計2008年5月份的平均溫度。
或許大家會這樣寫:
SELECT (AVG(T02)+AVG(T08)+AVG(T14)+AVG(T20))/4 FROM Temperature WHERE Year=2008 AND Month=5
如果不考慮空值的話,這樣完全正確,但是考慮空值的話,如果根本沒有統計02時的溫度,那麼AVG(T02)將為NULL,然後進行所有運算的結果都將為 NULL。這顯然是不正確的。
這裡可以建立一個自定義函式,然後使用一個SELECT語句即可查詢:
SELECT AVG(user.Average(T02,T08,T14,T20)) FROM Temperature WHERE Year=2008 AND Month=5
CREATE FUNCTION user.Average
(
@T02 float,
@T08 float,
@T14 float,
@T20 float
)
RETURNS float AS
BEGIN
DECLARE @sum float
DECLARE @num int
DECLARE @Ret float
SET @sum=0
SET @num=0
IF @T02 IS NOT NULL
BEGIN
SET @sum = @sum + @T02
SET @num = @num + 1
END
IF @T08 IS NOT NULL
BEGIN
SET @sum = @sum + @T08
SET @num = @num + 1
END
IF @T14 IS NOT NULL
BEGIN
SET @sum = @sum + @T14
SET @num = @num + 1
END
IF @T20 IS NOT NULL
BEGIN
SET @sum = @sum + @T20
SET @num = @num + 1
END
IF @num>0 SET @Ret = @sum / @num
Return @Ret
END
GO
總結:
使用者自定義函式在處理同一資料行中的各個欄位時,特別方便有用。雖然這裡使用儲存過程也能達到查詢目的,但是顯然沒有使用函式方便。而且,即使使用儲存過程也無法處理SELECT查詢中的同一資料行中的各個欄位的運算。因為儲存過程不返回值,使用時只能單獨呼叫;而函式卻能出現在能放置表示式的任何位置。
相關文章
- SQL中儲存過程和函式的區別SQL儲存過程函式
- Mysql 的儲存過程和儲存函式MySql儲存過程儲存函式
- mysql和orcale的儲存過程和儲存函式MySql儲存過程儲存函式
- Oracle 儲存過程 定義 和 優點 與 函式 區別Oracle儲存過程函式
- MySQL 儲存過程和函式MySql儲存過程函式
- MySQL儲存過程和函式MySql儲存過程函式
- 儲存過程 函式儲存過程函式
- 儲存過程與儲存函式儲存過程儲存函式
- mysql儲存函過程和儲存函式都屬於儲存程式MySql儲存函式
- 儲存過程與函式儲存過程函式
- MySQL 5.5 建立儲存過程和函式MySql儲存過程函式
- MySQL4:儲存過程和函式MySql儲存過程函式
- MySQL入門--儲存過程(PROCEDURE)和儲存函式(FUNCTION)MySql儲存過程儲存函式Function
- MySQL儲存過程 (即函式)MySql儲存過程函式
- mySql 儲存過程與函式MySql儲存過程函式
- SQL server儲存過程函式SQLServer儲存過程函式
- (9)mysql 中的儲存過程和自定義函式MySql儲存過程函式
- php呼叫mysql儲存過程和函式的方法(轉)PHPMySql儲存過程函式
- 在Oracle中查詢儲存過程和函式Oracle儲存過程函式
- day25-索引和函式及儲存過程索引函式儲存過程
- 儲存過程vs.函式QM儲存過程函式
- mysql儲存過程基本函式(轉)MySql儲存過程函式
- 匯出系統表中的儲存過程和函式儲存過程函式
- mysql儲存過程procedure、函式function的用法MySql儲存過程函式Function
- PL/SQL 中的儲存過程與函式SQL儲存過程函式
- (Oracle)儲存過程、儲存函式和包的相關知識與例項Oracle儲存過程儲存函式
- MySQL自定義函式與儲存過程MySql函式儲存過程
- 七、函式-儲存過程-觸發器函式儲存過程觸發器
- PLSQL學習-【7儲存過程、函式】SQL儲存過程函式
- openGauss 函式及儲存過程支援函式儲存過程
- 函式儲存過程併發控制-案例函式儲存過程
- Oracle中執行儲存過程call和exec區別Oracle儲存過程
- 物件和函式的區別就是物件可以儲存狀態物件函式
- PKG_COLLECTION_LHR 儲存過程或函式返回集合型別儲存過程函式型別
- MySQL優化---儲存過程和儲存函式-1-轉自部落格園MySql優化儲存過程儲存函式
- oracle 建立過程、函式中as, is區別 ?Oracle函式
- mysql儲存過程及日期函式實踐MySql儲存過程函式
- 【fosoyo】SQL Server儲存過程/函式加/解密SQLServer儲存過程函式解密