楊武英 馮志鑫
摘 ?要: 數(shù)據(jù)庫多年來一直是計算機科學(xué)中重要的分支,有著十分廣泛的應(yīng)用。各個層次的工科學(xué)校都在多數(shù)專業(yè)里開設(shè)了不同種類的數(shù)據(jù)庫課程,根據(jù)實際情況的不同一般都會采取適合自己學(xué)校的教學(xué)方法,對內(nèi)容有不同方向的側(cè)重。存儲過程的應(yīng)用是數(shù)據(jù)庫應(yīng)用中重要的一環(huán),如何在教學(xué)過程中把握它的難點與重點是一件十分困難的事情。為了解決這個問題,進(jìn)行了深入的分析探討,以此來提高存儲過程的教學(xué)效果。
關(guān)鍵詞: 存儲過程;數(shù)據(jù)庫編程;函數(shù);關(guān)系數(shù)據(jù)庫
中圖分類號: G642.4 ? ?文獻(xiàn)標(biāo)識碼: A ? ?DOI:10.3969/j.issn.1003-6970.2019.05.045
本文著錄格式:楊武英,馮志鑫. 數(shù)據(jù)庫中存儲過程教學(xué)探討[J]. 軟件,2019,40(5):230232
【Abstract】: Database has been an important branch of computer science for many years, and has a very wide range of applications. Engineering schools at all levels have offered different kinds of database courses in most majors. According to the actual situation, they usually adopt teaching methods suitable for their own schools, with different emphasis on content. The application of stored procedure is an important part of database application. How to grasp its difficulties and key points in the teaching process is a very difficult thing. This paper makes an in-depth analysis and discussion of this problem in order to improve the teaching effectiveness of stored procedure.
【Key words】: Stored procedure; Database programming; Function; Relational database
0 ?引言
如何對數(shù)據(jù)、特別是規(guī)模巨大的數(shù)據(jù)進(jìn)行管理一直是計算機應(yīng)用的重要研究方向,其成果在科研、社會生活、商業(yè)應(yīng)用的各個方面都有著巨大的影響[1]。為了培養(yǎng)合格的數(shù)據(jù)庫[2]技術(shù)人才,國內(nèi)多數(shù)大學(xué)都開設(shè)了數(shù)據(jù)庫類的相關(guān)課程。伴隨著大數(shù)據(jù)、云計算時代的到來,各類數(shù)據(jù)庫軟件的功能日益強大,用人單位對畢業(yè)生的數(shù)據(jù)庫技術(shù)水平和實踐能力也提出了越來越高的要求,如何更深入淺出地完成數(shù)據(jù)庫的教學(xué)工作意義越來越重大[3-4]。
存儲過程[5]是數(shù)據(jù)庫編程里極為重要的一環(huán),但也是教學(xué)過程中非常難以處理的一環(huán),因為存儲過程(Stored Procedure)的定義和性質(zhì)都是十分模糊不好直觀描述的。多數(shù)教科書大多直接略過這個,
有的則將其簡單描述為一組語句的集合、以整體形式在數(shù)據(jù)庫服務(wù)器端執(zhí)行、經(jīng)編譯后存放在數(shù)據(jù)庫服務(wù)器端[6]。這樣的描述不僅難以讓學(xué)生對存儲過程產(chǎn)生直觀的印象,也和函數(shù)的定義顯得雷同,這就需要教師對存儲過程的相關(guān)概念和原理進(jìn)行深入的分析講解,并進(jìn)一步探討存儲過程的優(yōu)點及適用性,使學(xué)生能夠更好的理解這一部分的內(nèi)容。
1 ?存儲過程的實質(zhì)
存儲過程實質(zhì)上就是能完成一定操作的大型數(shù)據(jù)庫語句模塊化的批處理,例如SQL、Oracle中的存儲過程,最大的優(yōu)點是經(jīng)過服務(wù)器的第一次編譯后被再次調(diào)用時不需要被再次編譯,用戶通過名字就可以直接調(diào)用存儲過程,當(dāng)然了,如果該存儲過程帶有參數(shù)還必須對參數(shù)賦值。
在創(chuàng)建存儲過程的時候,創(chuàng)建語句書寫完畢提交后DBMS會進(jìn)行保存,但創(chuàng)建過程并沒有真的完成。必須等到程序第一次被執(zhí)行,DBMS對其優(yōu)化并將查詢計劃編譯后緩存到系統(tǒng)上,整個存儲過程才算真的建立。以后再運行存儲過程時,系統(tǒng)不必去重新創(chuàng)建一個新的查詢計劃而是直接使用緩存中的查詢計劃。有特殊要求時需要通過使用WITH RECOMPILE選項人工指定。這意味著每次使用創(chuàng)建好的存儲過程時都會跳過很多優(yōu)化和編譯工作從而節(jié)省時間。確切節(jié)省的時間量取決于批處理程序的復(fù)雜程度、批處理中表的大小、每個表上索引的數(shù)量等多個因素。對于簡單的任務(wù)來說節(jié)省的時間往往不可能很多,尤其是在課堂教學(xué)實例這種極其簡單的任務(wù)里,有時甚至?xí)寣W(xué)生覺得更加麻煩,產(chǎn)生一種效率更低的錯覺。但對于大型任務(wù)來說,節(jié)省的時間就顯得十分重要了,即使每次只能節(jié)省1秒或更少,但通過百分比可以計算出區(qū)別(比如1秒比2秒就快了100%)。特別當(dāng)需要進(jìn)行多次調(diào)用時或針對循環(huán)的情況,這一區(qū)別就會變得更加明顯。
2 ?對存儲過程和函數(shù)進(jìn)行區(qū)分
與存儲過程類似,數(shù)據(jù)庫中的函數(shù)也是為了可重復(fù)執(zhí)行操作數(shù)據(jù)庫語句的集合,兩者雖然有一定的相似性,但是還存在許多不同之處。在課堂上通過對這些區(qū)別的分析和總結(jié),使學(xué)生可以更好的區(qū)分這兩個容易混淆的知識點。
(1)標(biāo)識符不同:函數(shù)的標(biāo)識符為FUNCTION;存儲過程為PROCEDURE。
(2)參數(shù)的使用不同:存儲過程的參數(shù)分類比較多,分為輸入?yún)?shù)、輸出參數(shù)、可輸入輸出的參數(shù)[7];而函數(shù)只有輸入?yún)?shù)這一種形式。
(3)返回值不同:存儲過程的返回值,可以有多個值,并且可以返回參數(shù);函數(shù)的返回值,只能有一個值,且只能返回表對象或者值,不能返回參數(shù)。
(4)調(diào)用方式:函數(shù)的調(diào)用方式單一,而存儲過程的調(diào)用方式比較靈活,有多種調(diào)用方式。
(5)從使用上來說:函數(shù)的使用限制比存儲過程要多,如不能用臨時表、只能用表變量等。
(6)從實現(xiàn)的功能上說:相對簡單但針對性比較強的功能利用函數(shù)實現(xiàn)比較有優(yōu)勢,而實現(xiàn)比較復(fù)雜的功能用存儲過程更有優(yōu)勢。
(7)從靈活性上來說:函數(shù)多數(shù)時候作為查詢語句的一個部分來調(diào)用,位于FROM關(guān)鍵字的后面,而存儲過程一般是作為一個獨立的部分來執(zhí)行。
3 ?深入分析存儲過程的優(yōu)點
由于多數(shù)課本對于存儲過程的優(yōu)點都是簡略的一筆帶過,這就造成學(xué)生不能從這簡單的描述里明白存儲過程的優(yōu)點到底在哪里,從而無法激發(fā)學(xué)習(xí)的熱情,更不能在編程中充分利用存儲過程的這些優(yōu)點來解決問題。要想達(dá)到良好的教學(xué)效果,就必須解開學(xué)生心中的疑惑,給學(xué)生深入的分析存儲過程的優(yōu)點:
(1)存儲過程在編程上的獨立性
這一點幾乎所有的教科書上都沒有指出,課內(nèi)實驗因為過于簡單也不能體現(xiàn),極易被忽視,但卻是存儲過程最重要的優(yōu)勢。其原理是對用戶而言,編寫應(yīng)用程序源代碼的時候只需要輸入存儲過程的調(diào)用語句即可,并不接觸存儲過程服務(wù)器后臺的具體語句。維護(hù)數(shù)據(jù)庫的專業(yè)人員可隨時在后臺對存儲過程進(jìn)行修改,只要用于連接的名稱和參數(shù)不受影響,則對用戶的源代碼毫無影響,從而極大地提高了程序的可移植性。
(2)使用存儲過程能夠提高程序的執(zhí)行效率
如果一個程序的數(shù)據(jù)庫操作包含大量的Transaction-SQL代碼或需要被多次執(zhí)行,那么使用存儲過程要比一般的批處理有效率的多。因為批處理只是數(shù)據(jù)庫語句的簡單組合,每次被運行時DBMS都要對其重新進(jìn)行編譯和優(yōu)化,而存儲過程的最大特點就是預(yù)編譯,執(zhí)行時所有需要的分析、優(yōu)化都在第一次被執(zhí)行的時候由查詢優(yōu)化器完成并存在系統(tǒng)表中,以后再被調(diào)用時省去了優(yōu)化這個耗時的步驟執(zhí)行速度自然很快。
(3)使用存儲過程能夠節(jié)約網(wǎng)絡(luò)流量
這一點單靠學(xué)生自己是很難理解的,因為他們在學(xué)校的實驗里幾乎不可能接觸到這一塊的,需要老師進(jìn)行說明。以SQLsever的教學(xué)為例,用戶程序?qū)?shù)據(jù)庫對象進(jìn)行的操作如查詢、修改等,每一步都得傳輸對應(yīng)的SQL語句來實現(xiàn)[8],而如果將相對固定的操作利用存儲過程模塊化,那么當(dāng)用戶需要實現(xiàn)這些操作時,只需要一條傳輸調(diào)用該存儲過程的語句就可以讓DBMS實現(xiàn)所有的這些操作了。當(dāng)用戶數(shù)量比較多或者操作步驟比較復(fù)雜的時候,需要流量的差距就會十分巨大。
(4)可以利用存儲過程提升數(shù)據(jù)庫的安全性
因為存儲過程的便利性,很多外部程序中的操作都是利用定義在數(shù)據(jù)庫服務(wù)器里的存儲過程來運行的,系統(tǒng)管理員在對用戶進(jìn)行角色授權(quán)的時候?qū)?zhí)行存儲過程的權(quán)限進(jìn)行區(qū)分,使得只有擁有對應(yīng)角色的用戶才能執(zhí)行響應(yīng)的存儲過程,減少了非授權(quán)用戶越過權(quán)限對數(shù)據(jù)進(jìn)行訪問的風(fēng)險,從而保證數(shù)據(jù)的安全。
4 ?探討存儲過程的適用性
存儲過程的優(yōu)點雖然突出,但是局限性也很大,并不是什么地方都適合采用存儲過程的,當(dāng)學(xué)生理解了存儲過程的優(yōu)點和使用方法之后,可能會過多的使用存儲過程,這時就需要和學(xué)生進(jìn)一步探討存儲過程的適用性,以達(dá)到恰當(dāng)使用的目的。通過和學(xué)生進(jìn)行課堂討論和舉例分析,結(jié)論如下:
(1)使用存儲過程的程序往往需要專門的數(shù)據(jù)庫開發(fā)人員進(jìn)行維護(hù),但實際情況是用戶很難做到這一點。因為多數(shù)用戶并沒有特定的數(shù)據(jù)庫開發(fā)人員,而是由普通程序員兼職進(jìn)行數(shù)據(jù)庫操作的,這些普通程序員往往只會操作程序完成數(shù)據(jù)訪問,沒有足夠的培訓(xùn)在數(shù)據(jù)庫上進(jìn)行開發(fā),這就造成了應(yīng)用上的不方便。
(2)設(shè)計邏輯需要變更時,修改存儲過程比直接修改SQL語句[9-10]要麻煩的多,所以項目需求如果變動比較頻繁時,不建議使用存儲過程進(jìn)行編程。例如大型互聯(lián)網(wǎng)企業(yè)淘寶、知乎、微博等,多用PC服務(wù)器支撐,用戶量的增速是不可控的,同時在線訪問的用戶量也是不可控的,這對數(shù)據(jù)庫的壓力是非常大的,這就需要把業(yè)務(wù)邏輯放到其他語言的代碼層,從而可以借助一些軟硬件上的調(diào)配來讓負(fù)載均衡、平滑Web層的服務(wù)器來支持大規(guī)模的訪問,這種時候如果大量用存儲過程編程顯然是一件相當(dāng)冒險的事。
(3)在一些對高效率或者規(guī)范性要求比較高的項目編程中,以及一些對于算法要求比較高或者涉及多條數(shù)據(jù)邏輯的地方,則適用于運用存儲過程來解決問題。
5 ?結(jié)論
本文討論了在教學(xué)過程中如何更加深入的探討存儲過程的實質(zhì)、優(yōu)點和適用性,并分析了存儲過程與函數(shù)的區(qū)別。這些問題的澄清和解決有助于學(xué)生更好的理解存儲過程,激發(fā)學(xué)生對數(shù)據(jù)庫學(xué)習(xí)的熱情。
參考文獻(xiàn)
[1] 張義蘭, 李大學(xué). FOXBASE數(shù)據(jù)庫及其應(yīng)用. 復(fù)旦大學(xué)出版社, 1995.
[2] 薩師煊, 王姍. 數(shù)據(jù)庫系統(tǒng)概論第五版[M]. 北京: 高等教育出版社, 2013.
[3] 陳曉燕, 張鯤. 數(shù)據(jù)庫系統(tǒng)原理課程教學(xué)改革探索[J]. 軟件, 2018, 39(3): 102-105.
[4] 谷偉, 陳蓮君, 徐方勤. 產(chǎn)學(xué)模式在《數(shù)據(jù)庫原理》課程教學(xué)改革中的應(yīng)用[J]. 軟件, 2012, 33(7): 153-155.
[5] 馬垣. 關(guān)系數(shù)據(jù)庫理論[M]. 北京: 清華大學(xué)出版社, 1999.
[6] 王賀朝. 電子商務(wù)與數(shù)據(jù)庫應(yīng)用. 東南大學(xué)出版社, 2002.
[7] 周力. SQL Server 2000實用教程. 大連理工大學(xué)出版社, 2009.
[8] 張鯤. 高校計算機專業(yè)數(shù)據(jù)庫課程設(shè)計教學(xué)指導(dǎo)與實踐研究[J]. 軟件, 2012, 33(2): 84-86.
[9] 劉芬. 關(guān)于SQL數(shù)據(jù)庫的性能優(yōu)化問題的研究[J]. 軟件, 2012, 33(6): 139-141.
[10] 何玉潔, 梁琦. 數(shù)據(jù)庫原理與應(yīng)用(第二版). 北京: 機械工業(yè)出版社, 2011.