當(dāng)前位置:
首頁(yè) >
存储过程到底是什么
發(fā)布時(shí)間:2025/5/22
37
豆豆
在大型數(shù)據(jù)庫(kù)系統(tǒng)中,存儲(chǔ)過(guò)程和觸發(fā)器具有很重要的作用。無(wú)論是存儲(chǔ)過(guò)程還是觸發(fā)器,都是sql 語(yǔ)句和流程控制語(yǔ)句的集合。就本質(zhì)而言,觸發(fā)器也是一種存儲(chǔ)過(guò)程。存儲(chǔ)過(guò)程在運(yùn)算時(shí)生成執(zhí)行方式,
所以,以后對(duì)其再運(yùn)行時(shí)其執(zhí)行速度很快。sql server 2000 不僅提供了用戶自定義存儲(chǔ)過(guò)程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲(chǔ)過(guò)程。12.1.1 存儲(chǔ)過(guò)程的概念 存儲(chǔ)過(guò)程(stored procedure)是一組為了完成特定功能的sql 語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)。中用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。在sql server 的系列版本中存儲(chǔ)過(guò)程分為兩類:系統(tǒng)提供的存儲(chǔ)過(guò)程和用戶自定義存儲(chǔ)過(guò)程。系統(tǒng)過(guò)程主要存儲(chǔ)在master 數(shù)據(jù)庫(kù)中并以sp_為前綴,并且系統(tǒng)存儲(chǔ)過(guò)程主要是從系統(tǒng)表中獲取信息,
從而為系統(tǒng)管理員管理sql server 提供支持。通過(guò)系統(tǒng)存儲(chǔ)過(guò)程,ms sql server 中的許多管理性或信息性的活動(dòng)(如了解數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)庫(kù)信息)都可以被順利有效地完成。盡管這些系統(tǒng)存儲(chǔ)過(guò)程
被放在master 數(shù)據(jù)庫(kù)中,但是仍可以在其它數(shù)據(jù)庫(kù)中對(duì)其進(jìn)行調(diào)用,在調(diào)用時(shí)不必在存儲(chǔ)過(guò)程名前加上數(shù)據(jù)庫(kù)名。而且當(dāng)創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)時(shí),一些系統(tǒng)存儲(chǔ)過(guò)程會(huì)在新數(shù)據(jù)庫(kù)中被自動(dòng)創(chuàng)建。用戶自定義存
儲(chǔ)過(guò)程是由用戶創(chuàng)建并能完成某一特定功能(如查詢用戶所需數(shù)據(jù)信息)的存儲(chǔ)過(guò)程。在本章中所涉及到的存儲(chǔ)過(guò)程主要是指用戶自定義存儲(chǔ)過(guò)程。12.1.2 存儲(chǔ)過(guò)程的優(yōu)點(diǎn)當(dāng)利用ms sql server 創(chuàng)建一個(gè)應(yīng)用程序時(shí),transaction-sql 是一種主要的編程語(yǔ)言。若運(yùn)用transaction-sql 來(lái)進(jìn)行編程,有兩種方法。其一是,在本地存儲(chǔ)transaction- sql 程序,并
創(chuàng)建應(yīng)用程序向sql server 發(fā)送命令來(lái)對(duì)結(jié)果進(jìn)行處理。其二是,可以把部分用transaction-sql 編寫的程序作為存儲(chǔ)過(guò)程存儲(chǔ)在sql server 中,并創(chuàng)建應(yīng)用程序來(lái)調(diào)用存儲(chǔ)過(guò)程,對(duì)數(shù)據(jù)結(jié)果進(jìn)行處
理存儲(chǔ)過(guò)程能夠通過(guò)接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者確定;返回狀態(tài)值給調(diào)用者,指明調(diào)用是成功或是失敗;包括針對(duì)數(shù)據(jù)庫(kù)的操作語(yǔ)句,并且可以在一個(gè)存儲(chǔ)過(guò)程中調(diào)用另一存儲(chǔ)過(guò)程
。 我們通常更偏愛(ài)于使用第二種方法,即在sql server 中使用存儲(chǔ)過(guò)程而不是在客戶計(jì)算機(jī)上調(diào)用transaction-sql 編寫的一段程序,原因在于存儲(chǔ)過(guò)程具有以下優(yōu)點(diǎn):(1) 存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件式編程 存儲(chǔ)過(guò)程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過(guò)程的sql 語(yǔ)句。而且數(shù)據(jù)庫(kù)專業(yè)人員可隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼毫無(wú)影響(因?yàn)閼?yīng)用程序源代碼只包含存儲(chǔ)過(guò)
程的調(diào)用語(yǔ)句),從而極大地提高了程序的可移植性。(2) 存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度 如果某一操作包含大量的transaction-sql 代碼或分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí),查詢優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,
并給出最終被存在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的transaction- sql 語(yǔ)句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,因此速度相對(duì)要慢一些。(3) 存儲(chǔ)過(guò)程能夠減少網(wǎng)絡(luò)流量 對(duì)于同一個(gè)針對(duì)數(shù)據(jù)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢、修改),如果這一操作所涉及到的 transaction-sql 語(yǔ)句被組織成一存儲(chǔ)過(guò)程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語(yǔ)句
,否則將是多條sql 語(yǔ)句,從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負(fù)載。(4) 存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用 系統(tǒng)管理員通過(guò)對(duì)執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限進(jìn)行限制,從而能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)訪問(wèn)權(quán)限的限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問(wèn),保證數(shù)據(jù)的安全。(我們將在14 章“sqlserver 的用戶和安全性管理”中
對(duì)存儲(chǔ)過(guò)程的這一應(yīng)用作更為清晰的介紹)注意:存儲(chǔ)過(guò)程雖然既有參數(shù)又有返回值,但是它與函數(shù)不同。存儲(chǔ)過(guò)程的返回值只是指明執(zhí)行是否成功,并且它不能像函數(shù)那樣被直接調(diào)用,也就是在調(diào)用存儲(chǔ)過(guò)程時(shí),在存儲(chǔ)過(guò)程名字前一定要有exec保
留字(如何執(zhí)行存儲(chǔ)過(guò)程見(jiàn)本章下一字)。
所以,以后對(duì)其再運(yùn)行時(shí)其執(zhí)行速度很快。sql server 2000 不僅提供了用戶自定義存儲(chǔ)過(guò)程的功能,而且也提供了許多可作為工具使用的系統(tǒng)存儲(chǔ)過(guò)程。12.1.1 存儲(chǔ)過(guò)程的概念 存儲(chǔ)過(guò)程(stored procedure)是一組為了完成特定功能的sql 語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)。中用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它。在sql server 的系列版本中存儲(chǔ)過(guò)程分為兩類:系統(tǒng)提供的存儲(chǔ)過(guò)程和用戶自定義存儲(chǔ)過(guò)程。系統(tǒng)過(guò)程主要存儲(chǔ)在master 數(shù)據(jù)庫(kù)中并以sp_為前綴,并且系統(tǒng)存儲(chǔ)過(guò)程主要是從系統(tǒng)表中獲取信息,
從而為系統(tǒng)管理員管理sql server 提供支持。通過(guò)系統(tǒng)存儲(chǔ)過(guò)程,ms sql server 中的許多管理性或信息性的活動(dòng)(如了解數(shù)據(jù)庫(kù)對(duì)象、數(shù)據(jù)庫(kù)信息)都可以被順利有效地完成。盡管這些系統(tǒng)存儲(chǔ)過(guò)程
被放在master 數(shù)據(jù)庫(kù)中,但是仍可以在其它數(shù)據(jù)庫(kù)中對(duì)其進(jìn)行調(diào)用,在調(diào)用時(shí)不必在存儲(chǔ)過(guò)程名前加上數(shù)據(jù)庫(kù)名。而且當(dāng)創(chuàng)建一個(gè)新數(shù)據(jù)庫(kù)時(shí),一些系統(tǒng)存儲(chǔ)過(guò)程會(huì)在新數(shù)據(jù)庫(kù)中被自動(dòng)創(chuàng)建。用戶自定義存
儲(chǔ)過(guò)程是由用戶創(chuàng)建并能完成某一特定功能(如查詢用戶所需數(shù)據(jù)信息)的存儲(chǔ)過(guò)程。在本章中所涉及到的存儲(chǔ)過(guò)程主要是指用戶自定義存儲(chǔ)過(guò)程。12.1.2 存儲(chǔ)過(guò)程的優(yōu)點(diǎn)當(dāng)利用ms sql server 創(chuàng)建一個(gè)應(yīng)用程序時(shí),transaction-sql 是一種主要的編程語(yǔ)言。若運(yùn)用transaction-sql 來(lái)進(jìn)行編程,有兩種方法。其一是,在本地存儲(chǔ)transaction- sql 程序,并
創(chuàng)建應(yīng)用程序向sql server 發(fā)送命令來(lái)對(duì)結(jié)果進(jìn)行處理。其二是,可以把部分用transaction-sql 編寫的程序作為存儲(chǔ)過(guò)程存儲(chǔ)在sql server 中,并創(chuàng)建應(yīng)用程序來(lái)調(diào)用存儲(chǔ)過(guò)程,對(duì)數(shù)據(jù)結(jié)果進(jìn)行處
理存儲(chǔ)過(guò)程能夠通過(guò)接收參數(shù)向調(diào)用者返回結(jié)果集,結(jié)果集的格式由調(diào)用者確定;返回狀態(tài)值給調(diào)用者,指明調(diào)用是成功或是失敗;包括針對(duì)數(shù)據(jù)庫(kù)的操作語(yǔ)句,并且可以在一個(gè)存儲(chǔ)過(guò)程中調(diào)用另一存儲(chǔ)過(guò)程
。 我們通常更偏愛(ài)于使用第二種方法,即在sql server 中使用存儲(chǔ)過(guò)程而不是在客戶計(jì)算機(jī)上調(diào)用transaction-sql 編寫的一段程序,原因在于存儲(chǔ)過(guò)程具有以下優(yōu)點(diǎn):(1) 存儲(chǔ)過(guò)程允許標(biāo)準(zhǔn)組件式編程 存儲(chǔ)過(guò)程在被創(chuàng)建以后可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過(guò)程的sql 語(yǔ)句。而且數(shù)據(jù)庫(kù)專業(yè)人員可隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,但對(duì)應(yīng)用程序源代碼毫無(wú)影響(因?yàn)閼?yīng)用程序源代碼只包含存儲(chǔ)過(guò)
程的調(diào)用語(yǔ)句),從而極大地提高了程序的可移植性。(2) 存儲(chǔ)過(guò)程能夠?qū)崿F(xiàn)較快的執(zhí)行速度 如果某一操作包含大量的transaction-sql 代碼或分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的,在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí),查詢優(yōu)化器對(duì)其進(jìn)行分析、優(yōu)化,
并給出最終被存在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的transaction- sql 語(yǔ)句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,因此速度相對(duì)要慢一些。(3) 存儲(chǔ)過(guò)程能夠減少網(wǎng)絡(luò)流量 對(duì)于同一個(gè)針對(duì)數(shù)據(jù)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢、修改),如果這一操作所涉及到的 transaction-sql 語(yǔ)句被組織成一存儲(chǔ)過(guò)程,那么當(dāng)在客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語(yǔ)句
,否則將是多條sql 語(yǔ)句,從而大大增加了網(wǎng)絡(luò)流量,降低網(wǎng)絡(luò)負(fù)載。(4) 存儲(chǔ)過(guò)程可被作為一種安全機(jī)制來(lái)充分利用 系統(tǒng)管理員通過(guò)對(duì)執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限進(jìn)行限制,從而能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)訪問(wèn)權(quán)限的限制,避免非授權(quán)用戶對(duì)數(shù)據(jù)的訪問(wèn),保證數(shù)據(jù)的安全。(我們將在14 章“sqlserver 的用戶和安全性管理”中
對(duì)存儲(chǔ)過(guò)程的這一應(yīng)用作更為清晰的介紹)注意:存儲(chǔ)過(guò)程雖然既有參數(shù)又有返回值,但是它與函數(shù)不同。存儲(chǔ)過(guò)程的返回值只是指明執(zhí)行是否成功,并且它不能像函數(shù)那樣被直接調(diào)用,也就是在調(diào)用存儲(chǔ)過(guò)程時(shí),在存儲(chǔ)過(guò)程名字前一定要有exec保
留字(如何執(zhí)行存儲(chǔ)過(guò)程見(jiàn)本章下一字)。
轉(zhuǎn)載于:https://www.cnblogs.com/lmy01/p/6281376.html
總結(jié)
- 上一篇: polimerized&nbsp
- 下一篇: 5-重写与重载