存儲過程、函數、觸發器的區別
比較項目 |
存儲過程 |
函數 |
是否有返回值 |
可以有,也可以沒有 |
必須有且只有一個 |
是否可以單獨執行 |
可以 |
必須通過execute執行 |
SQL語句(DML或SELECT)可否調用 |
不可以 |
可以,且可以位於FROM關鍵字的后面(由於可以返回表對象) |
參數類型 |
可以使用IN、OUT、IN OUT三種模式的參數 |
只有IN,Oracle可以使用IN、OUT、IN OUT三種參數 |
返回值類型 |
可以通過OUT、IN OUT參數返回零個或多個參數值 |
單一值或一個表對象 |
1)一般來說,存儲過程實現的功能要復雜一點,而函數實現的功能針對性比較強。
2)存儲過程一般是作為一個獨立的部分來執行(參照下面“存儲過程-調用方法”),而函數可以作為查詢語句的一個部分來調用(用在select后面,或者from后面)。由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的后面。
存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經編譯后存儲在數據庫中。存儲過程經過語法檢查和編譯的SQL語句,所以執行速度比普通的SQL語句的執行速度快。用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。
1. 存儲過程只在創建時進行編譯,以后執行存儲過程都不需再重新編譯,而一般SQL語句每執行一次就編譯一次,所以使用存儲過程可提高數據庫執行速度。
2. 當對數據庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來。
3. 可以在過程中調用另一個存儲過程。可以在存儲過程中調用函數。這可以簡化一系列復雜語句。
4. 安全性高,可設定只有某用戶才具有對指定存儲過程的使用權。
5. 參數有三種(IN、OUT、IN 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表示as或is
調用語法
調用語法:
1)exec <過程名>;
2)execute <過程名>;
3)對於Oracle數據庫,可在PL/SQL語句塊中直接調用。(Oracle)
數據庫中的函數包括內置函數和自定義函數,內置函數是諸如SUM(),COUNT(),AVG()等數據庫內置的函數。一般我們編寫的函數都屬於自定義函數。
1. 函數只有一種參數(IN),只有一條RETURN語句,只能返回單一的值。
2. 可在SQL語句(DML或SELECT)中調用函數。由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的后面。
create function <函數名>(<參數列表,無參時忽略>)
return <返回值類型,無長度說明>
as|is
變量聲明、初始化
begin
業務處理、邏輯代碼
return <返回的值>;
exception
異常捕獲、容錯處理
end <函數名>;
參數:in入參
注:只有入參的類型。
調用語法
1)在SQL語句(DML或SELECT)中調用函數
2)對於Oracle數據庫,可在PL/SQL語句塊中直接調用。(Oracle)
觸發器
觸發器是特殊的存儲過程,存儲過程需要程序調用,而觸發器會自動執行;