創(chuàng)建存儲(chǔ)過(guò)程
專注于為中小企業(yè)提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)武川免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
CREATE PROCEDURE 存儲(chǔ)過(guò)程名()
一個(gè)例子說(shuō)明:一個(gè)返回產(chǎn)品平均價(jià)格的存儲(chǔ)過(guò)程如下代碼:
CREATE PROCEDURE productpricing()
BEGIN
SELECT Avg(prod_price) AS priceaverage
FROM products;
END;
//創(chuàng)建存儲(chǔ)過(guò)程名為productpricing,如果存儲(chǔ)過(guò)程需要接受參數(shù),可以在()中列舉出來(lái)。即使沒(méi)有參數(shù)后面仍然要跟()。BEGIN和END語(yǔ)句用來(lái)限定存儲(chǔ)過(guò)程體,過(guò)程體本身是個(gè)簡(jiǎn)單的SELECT語(yǔ)句
1 用mysql客戶端登入
2 選擇數(shù)據(jù)庫(kù)
mysqluse test
3 查詢當(dāng)前數(shù)據(jù)庫(kù)有哪些存儲(chǔ)過(guò)程
mysqlshow procedure status where Db='test'
4 創(chuàng)建一個(gè)簡(jiǎn)單的存儲(chǔ)過(guò)程
mysqlcreate procedure hi() select 'hello';
5 存儲(chǔ)過(guò)程創(chuàng)建完畢,看怎么調(diào)用它
mysqlcall hi();
顯示結(jié)果 mysql call hi();
+-------+
| hello |
+-------+
| hello |
+-------+
1 row in set (0.00 sec) Query OK, 0 rows affected (0.01 sec)
6 一個(gè)簡(jiǎn)單的儲(chǔ)存過(guò)程就成功了
在MYSQL 中 終于引入了存儲(chǔ)過(guò)程這一新特性 這將大大增強(qiáng)MYSQL 的數(shù)據(jù)庫(kù)處理能力 在本文中 將指導(dǎo)讀者快速掌握MYSQL 的存儲(chǔ)過(guò)程的基本知識(shí) 帶領(lǐng)用戶入門(mén)
存儲(chǔ)過(guò)程介紹
存儲(chǔ)過(guò)程是一組為了完成特定功能的SQL語(yǔ)句集 經(jīng)編譯后存儲(chǔ)在數(shù)據(jù)庫(kù)中 用戶通過(guò)指定存儲(chǔ)過(guò)程的名字并給出參數(shù)(如果該存儲(chǔ)過(guò)程帶有參數(shù))來(lái)執(zhí)行它 存儲(chǔ)過(guò)程可由應(yīng)用程序通過(guò)一個(gè)調(diào)用來(lái)執(zhí)行 而且允許用戶聲明變量 同時(shí) 存儲(chǔ)過(guò)程可以接收和輸出參數(shù) 返回執(zhí)行存儲(chǔ)過(guò)程的狀態(tài)值 也可以嵌套調(diào)用
存儲(chǔ)過(guò)程的優(yōu)點(diǎn)
作為存儲(chǔ)過(guò)程 有以下這些優(yōu)點(diǎn)
( )減少網(wǎng)絡(luò)通信量 調(diào)用一個(gè)行數(shù)不多的存儲(chǔ)過(guò)程與直接調(diào)用SQL語(yǔ)句的網(wǎng)絡(luò)通信量可能不會(huì)有很大的差別 可是如果存儲(chǔ)過(guò)程包含上百行SQL語(yǔ)句 那么其性能絕對(duì)比一條一條的調(diào)用SQL語(yǔ)句要高得多
( )執(zhí)行速度更快 存儲(chǔ)過(guò)程創(chuàng)建的時(shí)候 數(shù)據(jù)庫(kù)已經(jīng)對(duì)其進(jìn)行了一次解析和優(yōu)化 其次 存儲(chǔ)過(guò)程一旦執(zhí)行 在內(nèi)存中就會(huì)保留一份這個(gè)存儲(chǔ)過(guò)程 這樣下次再執(zhí)行同樣的存儲(chǔ)過(guò)程時(shí) 可以從內(nèi)存中直接中讀取
( )更強(qiáng)的安全性 存儲(chǔ)過(guò)程是通過(guò)向用戶授予權(quán)限(而不是基于表) 它們可以提供對(duì)特定數(shù)據(jù)的訪問(wèn) 提高代碼安全 比如防止 SQL注入
( ) 業(yè)務(wù)邏輯可以封裝存儲(chǔ)過(guò)程中 這樣不僅容易維護(hù) 而且執(zhí)行效率也高
當(dāng)然存儲(chǔ)過(guò)程也有一些缺點(diǎn) 比如
可移植性方面 當(dāng)從一種數(shù)據(jù)庫(kù)遷移到另外一種數(shù)據(jù)庫(kù)時(shí) 不少的存儲(chǔ)過(guò)程的編寫(xiě)要進(jìn)行部分修改
存儲(chǔ)過(guò)程需要花費(fèi)一定的學(xué)習(xí)時(shí)間去學(xué)習(xí) 比如學(xué)習(xí)其語(yǔ)法等
在MYSQL中 推薦使用MYSQL Query Browswer()這個(gè)工具去進(jìn)行存儲(chǔ)過(guò)程的開(kāi)發(fā)和管理 下面分步驟來(lái)學(xué)習(xí)MYSQL中的存儲(chǔ)過(guò)程
定義存儲(chǔ)過(guò)程的結(jié)束符
在存儲(chǔ)過(guò)程中 通常要輸入很多SQL語(yǔ)句 而SQL語(yǔ)句中每個(gè)語(yǔ)句以分號(hào)來(lái)結(jié)束 因此要告訴存儲(chǔ)過(guò)程 什么位置是意味著整個(gè)存儲(chǔ)過(guò)程結(jié)束 所以我們?cè)诰帉?xiě)存儲(chǔ)過(guò)程前 先定義分隔符 我們這里定義 // 為分隔符 我們使用DELIMITER //這樣的語(yǔ)法 就可以定義結(jié)束符了 當(dāng)然你可以自己定義其他喜歡的符號(hào)
如何創(chuàng)建存儲(chǔ)過(guò)程
下面先看下一個(gè)簡(jiǎn)單的例子 代碼如下
DELIMITER?//CREATEPROCEDURE?`p ` ()LANGUAGE SQLDETERMINISTICSQL SECURITY DEFINERMENT? A procedure BEGINSELECT Hello World ! ;END//
下面講解下存儲(chǔ)過(guò)程的組成部分
)首先在定義好終結(jié)符后 使用CREATE PROCEDURE+存儲(chǔ)過(guò)程名的方法創(chuàng)建存儲(chǔ)過(guò)程 LANGUAGE選項(xiàng)指定了使用的語(yǔ)言 這里默認(rèn)是使用SQL
)DETERMINISTIC關(guān)鍵詞的作用是 當(dāng)確定每次的存儲(chǔ)過(guò)程的輸入和輸出都是相同的內(nèi)容時(shí) 可以使用該關(guān)鍵詞 否則默認(rèn)為NOT DETERMINISTIC
) SQL SECURITY關(guān)鍵詞 是表示調(diào)用時(shí)檢查用戶的權(quán)限 當(dāng)值為INVOKER時(shí) 表示是用戶調(diào)用該存儲(chǔ)過(guò)程時(shí)檢查 默認(rèn)為DEFINER 即創(chuàng)建存儲(chǔ)過(guò)程時(shí)檢查
) MENT部分是存儲(chǔ)過(guò)程的注釋說(shuō)明部分
lishixinzhi/Article/program/MySQL/201404/30557