今天就跟大家聊聊有關(guān)如何進(jìn)行MySQL存儲(chǔ),可能很多人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,希望大家根據(jù)這篇文章可以有所收獲。
創(chuàng)新互聯(lián)建站專(zhuān)注于西吉網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠(chéng)為您提供西吉營(yíng)銷(xiāo)型網(wǎng)站建設(shè),西吉網(wǎng)站制作、西吉網(wǎng)頁(yè)設(shè)計(jì)、西吉網(wǎng)站官網(wǎng)定制、重慶小程序開(kāi)發(fā)服務(wù),打造西吉網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供西吉網(wǎng)站排名全網(wǎng)營(yíng)銷(xiāo)落地服務(wù)。
一、存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程是在大型數(shù)據(jù)庫(kù)系統(tǒng)中一組為了完成特定功能的SQL語(yǔ)句集,存儲(chǔ)在數(shù)據(jù)庫(kù)中。存儲(chǔ)過(guò)程經(jīng)過(guò)第一次編譯后,再次調(diào)用不需要編譯,用戶(hù)可以通過(guò)指定的存儲(chǔ)過(guò)程名和給出一些存儲(chǔ)過(guò)程定義的參數(shù)來(lái)使用它。存儲(chǔ)過(guò)程就是為以后使用而保存的一條或多條SQL語(yǔ)句,個(gè)人理解跟函數(shù)類(lèi)似,一般用的較少。
好處:
通過(guò)把處理封裝在一個(gè)易用的單元中,可以簡(jiǎn)化復(fù)雜的操作。
2.不需要反復(fù)建立一系列的處理步驟,因而保證了數(shù)據(jù)的一致性。
3.簡(jiǎn)化了對(duì)變動(dòng)的管理,這一點(diǎn)的延伸就是安全性。
4.存儲(chǔ)過(guò)程通常以編譯過(guò)的形式存儲(chǔ),所以DBMS處理命令所需的工作量少,提高了性能。
缺點(diǎn):
1.可移植性差
2.對(duì)于簡(jiǎn)單的SQL語(yǔ)句,存儲(chǔ)過(guò)程沒(méi)什么優(yōu)勢(shì)
4.如果只有一個(gè)用戶(hù)使用數(shù)據(jù)庫(kù),那么存儲(chǔ)過(guò)程對(duì)安全也沒(méi)什么影響
5.團(tuán)隊(duì)開(kāi)發(fā)時(shí)需要先統(tǒng)一標(biāo)準(zhǔn),否則后期維護(hù)成本大
6.在大并發(fā)量訪(fǎng)問(wèn)的情況下,不宜寫(xiě)過(guò)多涉及運(yùn)算的存儲(chǔ)過(guò)程
7.業(yè)務(wù)邏輯復(fù)雜時(shí),特別是涉及到對(duì)很大的表進(jìn)行操作的時(shí)候,不如在前端先簡(jiǎn)化業(yè)務(wù)邏輯
二、存儲(chǔ)過(guò)程語(yǔ)法格式
一般形式
create procedure [過(guò)程名]([in|out|inout] [參數(shù)名] [參數(shù)類(lèi)型],...) begin [SQL語(yǔ)句集;] end
在定義參數(shù)部分時(shí)in表示傳入?yún)?shù),讀取外部變量值賦給內(nèi)部參數(shù),但內(nèi)部參數(shù)的作用域僅限存儲(chǔ)過(guò)程;out表示傳出參數(shù),將內(nèi)部參數(shù)傳遞到外部變量;inout既有in的功能,又用out的功能,屬于in與out的結(jié)合體。在都不寫(xiě)的情況下,默認(rèn)使用in選項(xiàng)
但是,由于SQL語(yǔ)句集部分一樣使用的是分號(hào)(;)作為分隔符,所以要在創(chuàng)建存儲(chǔ)過(guò)程前使用delimiter重新定義分隔符,并在創(chuàng)建完成后將分隔符還原。delimiter [新分隔符]
完整格式
delimiter [新分隔符] create procedure [過(guò)程名]([in|out|inout] [參數(shù)名] [參數(shù)類(lèi)型],...) begin SQL語(yǔ)句集; end[新分隔符] delimiter;
三、存儲(chǔ)過(guò)程創(chuàng)建舉例說(shuō)明:
1.創(chuàng)建單條SQL存儲(chǔ)過(guò)程select_id(),(沒(méi)什么實(shí)際意義,僅僅舉例)
delimiter // create procedure select_id(inout id_inout int) begin select user_id from user where user_id=id_inout; end// delimiter; ##創(chuàng)建存儲(chǔ)過(guò)程select_id()
2.創(chuàng)建好存儲(chǔ)過(guò)程select_id()后,會(huì)保存在數(shù)據(jù)庫(kù)中。如果創(chuàng)同名的存儲(chǔ)過(guò)程會(huì)報(bào)錯(cuò),若要?jiǎng)?chuàng)建相同名稱(chēng)的存儲(chǔ)過(guò)程,需要?jiǎng)h除后方可創(chuàng)建。
PROCEDURE select_id already exists
創(chuàng)建多條SQL存儲(chǔ)過(guò)程select_ids()
delimiter $$ create procedure select_ids() begin select user_id from user; select customer_id from user; end$$ delimiter;
四、調(diào)用存儲(chǔ)過(guò)程
調(diào)用存儲(chǔ)過(guò)程很簡(jiǎn)單,call [過(guò)程名](@[外部參數(shù)名],.
調(diào)用select_id()
set@user_id=62356; call select_id(@user_id); 或者 call select_id(62356)
調(diào)用select_ids()
call select_ids();
五、查看存儲(chǔ)過(guò)程
1.查看存儲(chǔ)過(guò)程具體內(nèi)容
show create procedure test.select_id;
2.查看存儲(chǔ)過(guò)程狀態(tài)
show PROCEDURE status;
六、刪除存儲(chǔ)過(guò)程
drop procedure [過(guò)程名];
drop procedure test.select_id;
七、SQL語(yǔ)句集延伸說(shuō)明
1)定義存儲(chǔ)過(guò)程的內(nèi)部變量
定義變量語(yǔ)句:declare [變量名,...] [變量類(lèi)型] [default 默認(rèn)值];
賦值語(yǔ)句:set [變量名]=[表達(dá)式];
可以一次定義多個(gè)同類(lèi)型的變量,并且設(shè)置初始值。
2)多層嵌套
mysql> delimiter // mysql> create procedure select3() -> begin -> declare name varchar(20) default '學(xué)生'; -> select name; -> begin -> declare name varchar(20) default '老師'; -> select name; -> end; -> end // Query OK, 0 rows affected (0.00 sec) mysql> delimiter ;
3)條件語(yǔ)句
if語(yǔ)句
if [判斷語(yǔ)句] then [執(zhí)行內(nèi)容] end if; if [判斷語(yǔ)句] then [執(zhí)行內(nèi)容] else [執(zhí)行內(nèi)容] end if;
case語(yǔ)句
case [變量名] when [值] then [執(zhí)行內(nèi)容] when [值] then [執(zhí)行內(nèi)容] ... else [執(zhí)行內(nèi)容] end case;
循環(huán)語(yǔ)句
while語(yǔ)句,先判斷后運(yùn)行
while [判斷語(yǔ)句] do [執(zhí)行內(nèi)容] end while
mysql> create procedure `while`(in num int) -> begin -> declare var int; -> set var=0; -> while varset var=var+1; -> end while; -> select var; -> end //
repeat語(yǔ)句,先運(yùn)行后判斷
repeat [執(zhí)行內(nèi)容] until [判斷語(yǔ)句] end repeat;
mysql> create procedure `repeat`(in num int) -> begin -> declare var int; -> set var=0; -> repeat -> set var=var+2; -> until var>num -> end repeat; -> select var; -> end //
loop語(yǔ)句,運(yùn)行直到遇到leave
[標(biāo)簽名]:loop [執(zhí)行內(nèi)容] leave [標(biāo)簽名] [執(zhí)行內(nèi)容] end loop;
mysql> create procedure `loop`(in num int) -> begin -> declare var int; -> set var=0; -> label1:loop -> set var=var+2; -> if var>num then -> leave label1; -> end if; -> end loop; -> select var; -> end //
看完上述內(nèi)容,你們對(duì)如何進(jìn)行MySQL存儲(chǔ)有進(jìn)一步的了解嗎?如果還想了解更多知識(shí)或者相關(guān)內(nèi)容,請(qǐng)關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝大家的支持。