存儲過程、函數、觸發器的區別

存儲過程、函數、觸發器的區別

比較項目

存儲過程

函數

是否有返回值

可以有,也可以沒有

必須有且只有一個

是否可以單獨執行

可以

必須通過execute執行

SQL語句(DMLSELECT)可否調用

不可以

可以,且可以位於FROM關鍵字的後面(由於可以返回表對象)

參數類型

可以使用INOUTIN OUT三種模式的參數

只有INOracle可以使用INOUTIN OUT三種參數

返回值類型

可以通過OUTIN OUT參數返回零個或多個參數值

單一值或一個表對象

1)一般來說,存儲過程實現的功能要複雜一點,而函數實現的功能針對性比較強。 
2
)存儲過程一般是作爲一個獨立的部分來執行(參照下面存儲過程-調用方法),而函數可以作爲查詢語句的一個部分來調用(用在select後面,或者from後面)。由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。

存儲過程

存儲過程(Stored Procedure )是一組爲了完成特定功能的SQL 語句集,經編譯後存儲在數據庫中。存儲過程經過語法檢查和編譯的SQL語句,所以執行速度比普通的SQL語句的執行速度快。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。

特點

1.       存儲過程只在創建時進行編譯,以後執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。

2.       當對數據庫進行復雜操作時(如對多個表進行UpdateInsertQueryDelete時),可將此複雜操作用存儲過程封裝起來。

3.       可以在過程中調用另一個存儲過程。可以在存儲過程中調用函數。這可以簡化一系列複雜語句。

4.       安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。

5.       參數有三種(INOUTIN OUT),可返回多個參數值。

6.       ORACLE 中,若干個有聯繫的過程可以組合在一起構成程序包。

7.       存儲過程是數據庫中的一個重要對象,任何一個設計良好的數據庫應用程序都應該用到存儲過程。

缺點

1.       不可移植性,每種數據庫的內部編程語法都不太相同,當需要兼容多種數據庫時,最好不要用存儲過程。

2.       業務邏輯多處存在,採用存儲過程後也就意味着你的系統有一些業務邏輯不是在應用程序裏處理,這種架構會增加一些系統維護和調試成本。

基本語法

 

createprocedure <過程名>(<參數列表,無參時忽略>)

as|is

變量聲明、初始化

begin

業務處理、邏輯代碼

exception

異常捕獲、容錯處理

end <過程名>;

參數:<參數名> in|out|in out <參數類型,無長度說明,如:v_name varchar2

in:入參

out:出參

in out:出入參

注:as|is表示asis

 

 

調用語法

調用語法:

1exec <過程名>;

2execute <過程名>;

3)對於Oracle數據庫,可在PL/SQL語句塊中直接調用。(Oracle

函數

數據庫中的函數包括內置函數和自定義函數,內置函數是諸如SUM()COUNT()AVG()等數據庫內置的函數。一般我們編寫的函數都屬於自定義函數。

特點

1.       函數只有一種參數(IN),只有一條RETURN語句,只能返回單一的值。

2.       可在SQL語句(DMLSELECT)中調用函數。由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。

基本語法

 

 

create function <函數名>(<參數列表,無參時忽略>)

return <返回值類型,無長度說明>

as|is

變量聲明、初始化

begin

業務處理、邏輯代碼

return <返回的值>;

exception

異常捕獲、容錯處理

end <函數名>;

參數:in入參

注:只有入參的類型。

 

 

調用語法

1)在SQL語句(DMLSELECT)中調用函數 
2
)對於Oracle數據庫,可在PL/SQL語句塊中直接調用。(Oracle

觸發器

觸發器是特殊的存儲過程,存儲過程需要程序調用,而觸發器會自動執行;

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