今天就跟大家聊聊有關(guān)怎么寫(xiě)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
成都創(chuàng)新互聯(lián)主要從事成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì)、網(wǎng)頁(yè)設(shè)計(jì)、企業(yè)做網(wǎng)站、公司建網(wǎng)站等業(yè)務(wù)。立足成都服務(wù)扎魯特旗,十多年網(wǎng)站建設(shè)經(jīng)驗(yàn),價(jià)格優(yōu)惠、服務(wù)專(zhuān)業(yè),歡迎來(lái)電咨詢(xún)建站服務(wù):18982081108
SQL語(yǔ)句需要先編譯然后執(zhí)行,而存儲(chǔ)過(guò)程(Stored Procedure)是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,用戶(hù)通過(guò)指定存儲(chǔ)過(guò)程的名字并給定參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)調(diào)用執(zhí)行它。存儲(chǔ)過(guò)程是可編程的函數(shù),在數(shù)據(jù)庫(kù)中創(chuàng)建并保存,可以由SQL語(yǔ)句和控制結(jié)構(gòu)組成。當(dāng)想要在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的函數(shù),或者封裝特定功能時(shí),存儲(chǔ)過(guò)程是非常有用的。數(shù)據(jù)庫(kù)中的存儲(chǔ)過(guò)程可以看做是對(duì)編程中面向?qū)ο蠓椒ǖ哪M,它允許控制數(shù)據(jù)的訪問(wèn)方式。
存儲(chǔ)過(guò)程的優(yōu)點(diǎn):
(1).增強(qiáng)SQL語(yǔ)言的功能和靈活性:存儲(chǔ)過(guò)程可以用控制語(yǔ)句編寫(xiě),有很強(qiáng)的靈活性,可以完成復(fù)雜的判斷和較復(fù)雜的運(yùn)算。
(2).標(biāo)準(zhǔn)組件式編程:存儲(chǔ)過(guò)程被創(chuàng)建后,可以在程序中被多次調(diào)用,而不必重新編寫(xiě)該存儲(chǔ)過(guò)程的SQL語(yǔ)句。而且數(shù)據(jù)庫(kù)專(zhuān)業(yè)人員可以隨時(shí)對(duì)存儲(chǔ)過(guò)程進(jìn)行修改,對(duì)應(yīng)用程序源代碼毫無(wú)影響。
(3).較快的執(zhí)行速度:如果某一操作包含大量的Transaction-SQL代碼或分別被多次執(zhí)行,那么存儲(chǔ)過(guò)程要比批處理的執(zhí)行速度快很多。因?yàn)榇鎯?chǔ)過(guò)程是預(yù)編譯的。在首次運(yùn)行一個(gè)存儲(chǔ)過(guò)程時(shí)查詢(xún),優(yōu)化器對(duì)其進(jìn)行分析優(yōu)化,并且給出最終被存儲(chǔ)在系統(tǒng)表中的執(zhí)行計(jì)劃。而批處理的Transaction-SQL語(yǔ)句在每次運(yùn)行時(shí)都要進(jìn)行編譯和優(yōu)化,速度相對(duì)要慢一些。
(4).減少網(wǎng)絡(luò)流量:針對(duì)同一個(gè)數(shù)據(jù)庫(kù)對(duì)象的操作(如查詢(xún)、修改),如果這一操作所涉及的Transaction-SQL語(yǔ)句被組織進(jìn)存儲(chǔ)過(guò)程,那么當(dāng)在客戶(hù)計(jì)算機(jī)上調(diào)用該存儲(chǔ)過(guò)程時(shí),網(wǎng)絡(luò)中傳送的只是該調(diào)用語(yǔ)句,從而大大減少網(wǎng)絡(luò)流量并降低了網(wǎng)絡(luò)負(fù)載。
(5).作為一種安全機(jī)制來(lái)充分利用:通過(guò)對(duì)執(zhí)行某一存儲(chǔ)過(guò)程的權(quán)限進(jìn)行限制,能夠?qū)崿F(xiàn)對(duì)相應(yīng)的數(shù)據(jù)的訪問(wèn)權(quán)限的限制,避免了非授權(quán)用戶(hù)對(duì)數(shù)據(jù)的訪問(wèn),保證了數(shù)據(jù)的安全。
MySQL的存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是數(shù)據(jù)庫(kù)的一個(gè)重要的功能,MySQL 5.0以前并不支持存儲(chǔ)過(guò)程,這使得MySQL在應(yīng)用上大打折扣。好在MySQL 5.0開(kāi)始支持存儲(chǔ)過(guò)程,這樣即可以大大提高數(shù)據(jù)庫(kù)的處理速度,同時(shí)也可以提高數(shù)據(jù)庫(kù)編程的靈活性。
MySQL存儲(chǔ)過(guò)程的創(chuàng)建
語(yǔ)法
CREATE PROCEDURE 過(guò)程名([[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類(lèi)型[,[IN|OUT|INOUT] 參數(shù)名 數(shù)據(jù)類(lèi)型…]]) [特性 ...] 過(guò)程體 DELIMITER // CREATE PROCEDURE myproc(OUT s int) BEGIN SELECT COUNT(*) INTO s FROM students; END // DELIMITER ;
分隔符
MySQL默認(rèn)以";"為分隔符,如果沒(méi)有聲明分割符,則編譯器會(huì)把存儲(chǔ)過(guò)程當(dāng)成SQL語(yǔ)句進(jìn)行處理,因此編譯過(guò)程會(huì)報(bào)錯(cuò),所以要事先用“DELIMITER //”聲明當(dāng)前段分隔符,讓編譯器把兩個(gè)"http://"之間的內(nèi)容當(dāng)做存儲(chǔ)過(guò)程的代碼,不會(huì)執(zhí)行這些代碼;“DELIMITER ;”的意為把分隔符還原。
參數(shù)
存儲(chǔ)過(guò)程根據(jù)需要可能會(huì)有輸入、輸出、輸入輸出參數(shù),如果有多個(gè)參數(shù)用","分割開(kāi)。MySQL存儲(chǔ)過(guò)程的參數(shù)用在存儲(chǔ)過(guò)程的定義,共有三種參數(shù)類(lèi)型,IN,OUT,INOUT:
IN參數(shù)的值必須在調(diào)用存儲(chǔ)過(guò)程時(shí)指定,在存儲(chǔ)過(guò)程中修改該參數(shù)的值不能被返回,為默認(rèn)值OUT:該值可在存儲(chǔ)過(guò)程內(nèi)部被改變,并可返回INOUT:調(diào)用時(shí)指定,并且可被改變和返回
過(guò)程體
過(guò)程體的開(kāi)始與結(jié)束使用BEGIN與END進(jìn)行標(biāo)識(shí)。
總結(jié)
本次主要是掌握了對(duì)于存儲(chǔ)過(guò)程的使用,總的來(lái)說(shuō),存儲(chǔ)過(guò)程實(shí)際上類(lèi)似于C++中的函數(shù),而在C++中我們是需要在創(chuàng)建這一過(guò)程的文件中去調(diào)用這一函數(shù),但是對(duì)于存儲(chǔ)過(guò)程來(lái)說(shuō),相當(dāng)于是將這一操作過(guò)程存儲(chǔ)在數(shù)據(jù)庫(kù)中,可以使用call與對(duì)其進(jìn)行調(diào)用,并輸入或者輸出一些參數(shù)和結(jié)果。
印象最深的是類(lèi)似“in n int”和“out sum int”這樣的對(duì)于輸入輸出的定義,通過(guò)查看相關(guān)博客,可以總結(jié)如下對(duì)于輸入輸出定義的使用規(guī)律:
MySQL存儲(chǔ)過(guò)程的參數(shù)用在存儲(chǔ)過(guò)程的定義,共有三種參數(shù)類(lèi)型
IN,OUT,INOUT
格式為:Create procedure|function([[IN |OUT |INOUT ] 參數(shù)名 數(shù)據(jù)類(lèi)形...])
IN 輸入?yún)?shù)
表示該參數(shù)的值必須在調(diào)用存儲(chǔ)過(guò)程時(shí)指定,在存儲(chǔ)過(guò)程中修改該參數(shù)的值不能被返回,為默認(rèn)值
OUT 輸出參數(shù)
該值可在存儲(chǔ)過(guò)程內(nèi)部被改變,并可返回
INOUT 輸入輸出參數(shù)
調(diào)用時(shí)指定,并且可被改變和返回
IN 和 OUT在實(shí)驗(yàn)中已有體會(huì),主要是對(duì)INOUT的理解,這里引用一個(gè)例子:
參數(shù)inout的使用實(shí)例(既能輸入一個(gè)值又能傳出來(lái)一個(gè)值)
語(yǔ)句功能:傳一個(gè)年齡,自動(dòng)讓年齡增長(zhǎng)10歲
create procedure p3(inout age int)
begin
set age:=age+10;
end
其中:調(diào)用的時(shí)候,inout型的參數(shù)值既是輸入類(lèi)型又是輸出類(lèi)型,給它一個(gè)值,值不是變量,因此我們需要先設(shè)置一個(gè)變量并初始化這個(gè)值,調(diào)用的時(shí)候直接傳這個(gè)變量即可。
set @currentAge=8$
call p3(@currentAge)$
select @currentAge$
創(chuàng)建并執(zhí)行完存儲(chǔ)過(guò)程,運(yùn)行結(jié)果如下:
看完上述內(nèi)容,你們對(duì)怎么寫(xiě)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。