big data
通常情況下,當(dāng)我們輸入SQL命令以后,MySQL引擎首先分析SQL命令的語(yǔ)法格式是否正確,如果正確則編譯成MySQL引擎可以識(shí)別的命令,然后開(kāi)始執(zhí)行命令,最后將執(zhí)行的結(jié)果返回給客戶端。如果要將這個(gè)過(guò)程中的語(yǔ)法分析和編譯的過(guò)程省略掉,那么MySQL的執(zhí)行效率就會(huì)提升,這時(shí)就需要用到存儲(chǔ)過(guò)程。
SQL命令執(zhí)行流程
存儲(chǔ)過(guò)程就是SQL語(yǔ)句和控制語(yǔ)句的預(yù)編譯集合,以一個(gè)名稱存儲(chǔ)作為一個(gè)單元來(lái)進(jìn)行處理。有點(diǎn)類似于自定義函數(shù),可以由應(yīng)用程序調(diào)用執(zhí)行,允許用戶聲明變量并且進(jìn)行流程控制,存儲(chǔ)過(guò)程可以接受輸入類型的參數(shù)也可以接受輸出類型的參數(shù),并且可以由多個(gè)返回值。
存儲(chǔ)過(guò)程的優(yōu)點(diǎn):
(1)由于在存儲(chǔ)過(guò)程中可以寫控制語(yǔ)句,因此使SQL語(yǔ)句的靈活性增強(qiáng)。
(2)存儲(chǔ)過(guò)程只有在第一次執(zhí)行時(shí)才進(jìn)行分析和編譯,在以后的執(zhí)行過(guò)程中不再需要,因此執(zhí)行速度快。
(3)單獨(dú)發(fā)送SQL語(yǔ)句讓服務(wù)器執(zhí)行提交的信息量大,用存儲(chǔ)過(guò)程只要把用到的參數(shù)傳過(guò)去就可以,減少了網(wǎng)絡(luò)流量。
創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)法格式
其中IN表示這個(gè)參數(shù)必須在調(diào)用的時(shí)候指定,這個(gè)值不能被返回,OUT表示參數(shù)的值可以在存儲(chǔ)過(guò)程中被改變,而且這個(gè)值可以返回,INOUT表示這個(gè)參數(shù)在調(diào)用是指定,可以在存儲(chǔ)過(guò)程中被改變,也可以返回。
存儲(chǔ)過(guò)程中的過(guò)程體必須由合法的SQL語(yǔ)句構(gòu)成,SQL語(yǔ)句包括CURD以及多表連接查詢,過(guò)程體如果是復(fù)合結(jié)構(gòu)則要用BEGIN...END將語(yǔ)句包含在內(nèi),在復(fù)合結(jié)構(gòu)中可以使用流程控制語(yǔ)句,循環(huán)語(yǔ)句等。存儲(chǔ)過(guò)程是用關(guān)鍵字CALL來(lái)調(diào)用。
(1)創(chuàng)建帶IN類型參數(shù)的存儲(chǔ)過(guò)程示例:
CREATE PROCEDURE remove_student_byId(in id INT UNSIGNED)DELETE FROM student WHERE stu_id = id;
(2)創(chuàng)建帶有IN和OUT類型參數(shù)的存儲(chǔ)過(guò)程:
CREATE PROCEDURE remove_student_return_num(IN id INT UNSIGNED,OUT num INT UNSIGNED)
BEGIN DELETE FROM student WHERE stu_id = id;SELECT COUNT(stu_id) FROM student into num;END
存儲(chǔ)過(guò)程與自定義函數(shù)的區(qū)別:
存儲(chǔ)過(guò)程與自定義函數(shù)的區(qū)別
聯(lián)系客服