但是在數(shù)據(jù)庫的實(shí)際操作中,經(jīng)常會(huì)有一個(gè)完整的操作需要多條 sql 語句處理多個(gè)表才能完成。
例如,為了確認(rèn)學(xué)生能否畢業(yè),需要同時(shí)查詢學(xué)生檔案表、成績表和綜合表,此時(shí)就需要使用多條 SQL 語句來針對幾個(gè)數(shù)據(jù)表完成這個(gè)處理要求。存儲(chǔ)過程可以有效地完成這個(gè)數(shù)據(jù)庫操作。
存儲(chǔ)過程是數(shù)據(jù)庫存儲(chǔ)的一個(gè)重要的功能,但是 mysql 在 5.0 以前并不支持存儲(chǔ)過程,這使得 MySQL 在應(yīng)用上大打折扣。好在 MySQL 5.0 終于開始已經(jīng)支持存儲(chǔ)過程,這樣即可以大大提高數(shù)據(jù)庫的處理速度,同時(shí)也可以提高數(shù)據(jù)庫編程的靈活性。
存儲(chǔ)過程是一組為了完成特定功能的 SQL 語句集合。使用存儲(chǔ)過程的目的是將常用或復(fù)雜的工作預(yù)先用 SQL 語句寫好并用一個(gè)指定名稱存儲(chǔ)起來,這個(gè)過程經(jīng)編譯和優(yōu)化后存儲(chǔ)在數(shù)據(jù)庫服務(wù)器中,因此稱為存儲(chǔ)過程。當(dāng)以后需要數(shù)據(jù)庫提供與已定義好的存儲(chǔ)過程的功能相同的服務(wù)時(shí),只需調(diào)用“CALL存儲(chǔ)過程名字”即可自動(dòng)完成。
常用操作數(shù)據(jù)庫的 SQL 語句在執(zhí)行的時(shí)候需要先編譯,然后執(zhí)行。存儲(chǔ)過程則采用另一種方式來執(zhí)行 SQL 語句。
一個(gè)存儲(chǔ)過程是一個(gè)可編程的函數(shù),它在數(shù)據(jù)庫中創(chuàng)建并保存,一般由 SQL 語句和一些特殊的控制結(jié)構(gòu)組成。當(dāng)希望在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的特定功能時(shí),存儲(chǔ)過程尤為合適。
存儲(chǔ)過程通常有如下優(yōu)點(diǎn):
1) 封裝性
存儲(chǔ)過程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫該存儲(chǔ)過程的 SQL 語句,并且數(shù)據(jù)庫專業(yè)人員可以隨時(shí)對存儲(chǔ)過程進(jìn)行修改,而不會(huì)影響到調(diào)用它的應(yīng)用程序源代碼。
2) 可增強(qiáng) SQL 語句的功能和靈活性
存儲(chǔ)過程可以用流程控制語句編寫,有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。
3) 可減少網(wǎng)絡(luò)流量
由于存儲(chǔ)過程是在服務(wù)器端運(yùn)行的,且執(zhí)行速度快,因此當(dāng)客戶計(jì)算機(jī)上調(diào)用該存儲(chǔ)過程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語句,從而可降低網(wǎng)絡(luò)負(fù)載。
4) 高性能
存儲(chǔ)過程執(zhí)行一次后,產(chǎn)生的二進(jìn)制代碼就駐留在緩沖區(qū),在以后的調(diào)用中,只需要從緩沖區(qū)中執(zhí)行二進(jìn)制代碼即可,從而提高了系統(tǒng)的效率和性能。
5) 提高數(shù)據(jù)庫的安全性和數(shù)據(jù)的完整性
使用存儲(chǔ)過程可以完成所有數(shù)據(jù)庫操作,并且可以通過編程的方式控制數(shù)據(jù)庫信息訪問的權(quán)限。