區(qū)別:1、存儲(chǔ)函數(shù)的限制比較多,而存儲(chǔ)過(guò)程的限制較少;2、存儲(chǔ)過(guò)程的實(shí)現(xiàn)功能要復(fù)雜些,而存儲(chǔ)函數(shù)的實(shí)現(xiàn)功能針對(duì)性比較強(qiáng);3、存儲(chǔ)函數(shù)必須有一個(gè)返回值,而存儲(chǔ)過(guò)程可以沒(méi)有返回值;4、調(diào)用時(shí)的不同;5、參數(shù)的不同。
本教程操作環(huán)境:windows7系統(tǒng)、mysql8版本、Dell G3電腦。
存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)類(lèi)似于面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中的方法,可以簡(jiǎn)化代碼,提高代碼的重用性。本文主要介紹如何創(chuàng)建存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù),以及存儲(chǔ)過(guò)程與函數(shù)的使用、修改、刪除等操作。
存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)
MySQL中提供存儲(chǔ)過(guò)程與存儲(chǔ)函數(shù)機(jī)制,我們姑且將存儲(chǔ)過(guò)程和存儲(chǔ)函數(shù)合稱(chēng)為存儲(chǔ)程序。與一般的SQL語(yǔ)句需要先編譯然后立即執(zhí)行不同,存儲(chǔ)程序是一組為了完成特定功能的SQL語(yǔ)句集,經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中,當(dāng)用戶(hù)通過(guò)指定存儲(chǔ)程序的名字并給定參數(shù)(如果該存儲(chǔ)程序帶有參數(shù))來(lái)調(diào)用才會(huì)執(zhí)行。
存儲(chǔ)程序就是一條或者多條SQL語(yǔ)句和控制語(yǔ)句的集合,我們可以將其看作MySQL的批處理文件,當(dāng)然,其作用不僅限于批處理。當(dāng)想要在不同的應(yīng)用程序或平臺(tái)上執(zhí)行相同的功能一段程序或者封裝特定功能時(shí),存儲(chǔ)程序是非常有用的。數(shù)據(jù)庫(kù)中的存儲(chǔ)程序可以看做是面向?qū)幊讨忻嫦驅(qū)ο蠓椒?,它允許控制數(shù)據(jù)的訪問(wèn)方式。
存儲(chǔ)函數(shù)與存儲(chǔ)過(guò)程有如下區(qū)別:
(1)存儲(chǔ)函數(shù)的限制比較多,例如不能用臨時(shí)表,只能用表變量,而存儲(chǔ)過(guò)程的限制較少;存儲(chǔ)過(guò)程的實(shí)現(xiàn)功能要復(fù)雜些,而函數(shù)的實(shí)現(xiàn)功能針對(duì)性比較強(qiáng)。
(2)返回值不同。存儲(chǔ)函數(shù)必須有返回值,且僅返回一個(gè)結(jié)果值;存儲(chǔ)過(guò)程可以沒(méi)有返回值,但是能返回結(jié)果集(out,inout)。
(3)調(diào)用時(shí)的不同。存儲(chǔ)函數(shù)嵌入在SQL中使用,可以在select 存儲(chǔ)函數(shù)名(變量值);存儲(chǔ)過(guò)程通過(guò)call語(yǔ)句調(diào)用 call 存儲(chǔ)過(guò)程名。
(4)參數(shù)的不同。存儲(chǔ)函數(shù)的參數(shù)類(lèi)型類(lèi)似于IN參數(shù),沒(méi)有類(lèi)似于OUT和INOUT的參數(shù)。存儲(chǔ)過(guò)程的參數(shù)類(lèi)型有三種,IN、out和INOUT:
a. in:數(shù)據(jù)只是從外部傳入內(nèi)部使用(值傳遞),可以是數(shù)值也可以是變量
b. out:只允許過(guò)程內(nèi)部使用(不用外部數(shù)據(jù)),給外部使用的(引用傳遞:外部的數(shù)據(jù)會(huì)被先清空才會(huì)進(jìn)入到內(nèi)部),只能是變量
c. inout:外部可以在內(nèi)部使用,內(nèi)部修改的也可以給外部使用,典型的引用 傳遞,只能傳遞變量。
【