比較項目 | 存儲過程 | 函數(shù) |
是否有返回值 | 可以有,也可以沒有 | 必須有且只有一個 |
是否可以單獨執(zhí)行 | 可以 | 必須通過execute執(zhí)行 |
SQL語句(DML或SELECT)可否調(diào)用 | 不可以 | 可以,且可以位于FROM關(guān)鍵字的后面(由于可以返回表對象) |
參數(shù)類型 | 可以使用IN、OUT、IN OUT三種模式的參數(shù) | 只有IN,Oracle可以使用IN、OUT、IN OUT三種參數(shù) |
返回值類型 | 可以通過OUT、IN OUT參數(shù)返回零個或多個參數(shù)值 | 單一值或一個表對象 |
【我的理解】
SQL語句: 一句SQL語句就是一個命令,而一般來說一個命令只執(zhí)行一件事。
存儲過程: 里面可以有多個SQL語句,用事物可以保證多句語句必須都執(zhí)行成
功,這個存儲過程才執(zhí)行。
觸發(fā)器:是在對表進行插入、更新或刪除操作時自動執(zhí)行的存儲過程,觸發(fā)器通常用于強制業(yè)務(wù)規(guī)則。觸發(fā)器還是一個特殊的事務(wù)單元,當出現(xiàn)錯誤時,可以執(zhí)行ROLLBACK TRANSACTION回滾撤銷操作。
【站在巨人的肩膀上】
觸發(fā)器原理:
觸發(fā)器與存儲過程可以說是非常相似,可以說是一種變種的存儲過程,觸發(fā)器和存儲過程一樣都是SQL語句集,通常通過創(chuàng)建觸發(fā)器來強制實現(xiàn)不同表中的邏輯相關(guān)數(shù)據(jù)的引用完整性和一致性。由于用戶不能繞過觸發(fā)器,所以可以用它來強制實施復雜的業(yè)務(wù)規(guī)則,以確保數(shù)據(jù)的完整性。觸發(fā)器不同于存儲過程,觸發(fā)器主要是通過事件執(zhí)行觸發(fā)而被執(zhí)行的,而存儲過程可以通過存儲過程名稱名字而直接調(diào)用。當對某一表進行諸如UPDATE、INSERT、DELETE這些操作時,SQLSERVER就會自動執(zhí)行觸發(fā)器所定義的SQL語句,從而確保對數(shù)據(jù)的處理必須符合這些SQL語句所定義的規(guī)則。
觸發(fā)器的作用:
觸發(fā)器的主要作用是其能夠?qū)崿F(xiàn)由主鍵和外鍵所不能保證的復雜的參照完整性和數(shù)據(jù)的一致性。它能夠?qū)?shù)據(jù)庫中的相關(guān)表進行級聯(lián)修改,強制比CHECK約束更復雜的數(shù)據(jù)完整性,并自定義操作消息,維護非規(guī)范化數(shù)據(jù)以及比較數(shù)據(jù)修改前后的狀態(tài)。與CHECK約束不同,觸發(fā)器可以引用其它表中的列。在下列情況下使用觸發(fā)器實現(xiàn)復雜的引用完整性;強制數(shù)據(jù)間的完整性。創(chuàng)建多行觸發(fā)器,當插入,更新、刪除多行數(shù)據(jù)時,必須編寫一個處理多行數(shù)據(jù)的觸發(fā)器。執(zhí)行級聯(lián)更新或級聯(lián)刪除這樣的動作。級聯(lián)修改數(shù)據(jù)庫中所有相關(guān)表。撤銷或者回滾違反引用完整性的操作,防止非法修改數(shù)據(jù)。
觸發(fā)器與存儲過程的區(qū)別:
觸發(fā)器與存儲過程的主要區(qū)別在于觸發(fā)器的運行方式。存儲過程必須有用戶、應(yīng)用程序或者觸發(fā)器來顯示的調(diào)用并執(zhí)行,而觸發(fā)器是當特定時間出現(xiàn)的時候,自動執(zhí)行或者激活的,與連接用數(shù)據(jù)庫中的用戶、或者應(yīng)用程序無關(guān)。當一行被插入、更新或者刪除時觸發(fā)器才執(zhí)行,同時還取決于觸發(fā)器是怎樣創(chuàng)建的,當UPDATE發(fā)生時使用一個更新觸發(fā)器,當INSERT發(fā)生時使用一個插入觸發(fā)器,當DELETE發(fā)生時使用一個刪除觸發(fā)器
存儲過程和函數(shù)的區(qū)別:
1. 一般來說,存儲過程實現(xiàn)的功能要復雜一點,而函數(shù)的實現(xiàn)的功能針對性比較強。
2. 對于存儲過程來說可以返回參數(shù),而函數(shù)只能返回值或者表對象。
3. 存儲過程一般是作為一個獨立的部分來執(zhí)行,而函數(shù)可以作為查詢語句的一個部分來調(diào)用,由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。
4. 當存儲過程和函數(shù)被執(zhí)行的時候,SQL Manager會到procedure cache中去取相應(yīng)的查詢語句,如果在procedure cache里沒有相應(yīng)的查詢語句,SQL Manager就會對存儲過程和函數(shù)進行編譯。
Procedure cache中保存的是執(zhí)行計劃 (execution plan) ,當編譯好之后就執(zhí)行procedure cache中的execution plan,之后SQL SERVER會根據(jù)每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標準一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執(zhí)行時就不用再編譯了。
觸發(fā)器、存儲過程和函數(shù)三者有何區(qū)別:
觸發(fā)器是特殊的存儲過程,存儲過程需要程序調(diào)用,而觸發(fā)器會自動執(zhí)行;
在什么時候用觸發(fā)器?要求系統(tǒng)根據(jù)某些操作自動完成相關(guān)任務(wù)。
什么時候用存儲過程?
存儲過程就是程序,它是經(jīng)過語法檢查和編譯的SQL語句,所以運行特別快。
存儲過程和用戶自定義函數(shù)具體的區(qū)別
先看定義: 存儲過程存儲過程可以使得對數(shù)據(jù)庫的管理、以及顯示關(guān)于數(shù)據(jù)庫及其用戶信息的工作容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲并作為一個單元處理。
存儲過程存儲在數(shù)據(jù)庫內(nèi),可由應(yīng)用程序通過一個調(diào)用執(zhí)行,而且允許用戶聲明變量、有條件執(zhí)行以及其它強大的編程功能。存儲過程可包含程序流、邏輯以及對數(shù)據(jù)庫的查詢。它們可以接受參數(shù)、輸出參數(shù)、返回單個或多個結(jié)果集以及返回值。 可以出于任何使用 SQL 語句的目的來使用存儲過程,它具有以下優(yōu)點: 可以在單個存儲過程中。
1)一般來說,存儲過程實現(xiàn)的功能要復雜一點,而函數(shù)實現(xiàn)的功能針對性比較強。
2)存儲過程一般是作為一個獨立的部分來執(zhí)行,而函數(shù)可以作為查詢語句的一個部分來調(diào)用。由于函數(shù)可以返回一個表對象,因此它可以在查詢語句中位于FROM關(guān)鍵字的后面。
存儲過程
存儲過程(Stored Procedure )是一組為了完成特定功能的SQL 語句集,經(jīng)編譯后存儲在數(shù)據(jù)庫中。存儲過程經(jīng)過語法檢查和編譯的SQL語句,所以執(zhí)行速度比普通的SQL語句的執(zhí)行速度快。用戶通過指定存儲過程的名字并給出參數(shù)(如果該存儲過程帶有參數(shù))來執(zhí)行它。
特點
1. 存儲過程只在創(chuàng)建時進行編譯,以后執(zhí)行存儲過程都不需再重新編譯,而一般SQL語句每執(zhí)行一次就編譯一次,所以使用存儲過程可提高數(shù)據(jù)庫執(zhí)行速度。
2. 當對數(shù)據(jù)庫進行復雜操作時(如對多個表進行Update、Insert、Query、Delete時),可將此復雜操作用存儲過程封裝起來。
3. 可以在過程中調(diào)用另一個存儲過程。可以在存儲過程中調(diào)用函數(shù)。這可以簡化一系列復雜語句。
4. 安全性高,可設(shè)定只有某用戶才具有對指定存儲過程的使用權(quán)。
5. 參數(shù)有三種(IN、OUT、IN OUT),可返回多個參數(shù)值。
6. 在ORACLE 中,若干個有聯(lián)系的過程可以組合在一起構(gòu)成程序包。
7. 存儲過程是數(shù)據(jù)庫中的一個重要對象,任何一個設(shè)計良好的數(shù)據(jù)庫應(yīng)用程序都應(yīng)該用到存儲過程。
缺點
1. 不可移植性,每種數(shù)據(jù)庫的內(nèi)部編程語法都不太相同,當需要兼容多種數(shù)據(jù)庫時,最好不要用存儲過程。
2. 業(yè)務(wù)邏輯多處存在,采用存儲過程后也就意味著你的系統(tǒng)有一些業(yè)務(wù)邏輯不是在應(yīng)用程序里處理,這種架構(gòu)會增加一些系統(tǒng)維護和調(diào)試成本。