MySQL存储过程和游标
MySQL5?中添加了存儲(chǔ)過(guò)程的支持。
????大多數(shù)SQL語(yǔ)句都是針對(duì)一個(gè)或多個(gè)表的單條語(yǔ)句。并非所有的操作都怎么簡(jiǎn)單。經(jīng)常會(huì)有一個(gè)完整的操作需要多條才能完成
????存儲(chǔ)過(guò)程簡(jiǎn)單來(lái)說(shuō),就是為以后的使用而保存的一條或多條MySQL語(yǔ)句的集合。可將其視為批文件。雖然他們的作用不僅限于批處理。
?
為什么要使用存儲(chǔ)過(guò)程:
優(yōu)點(diǎn)
????????1?通過(guò)吧處理封裝在容易使用的單元中,簡(jiǎn)化復(fù)雜的操作
????????2?由于不要求反復(fù)建立一系列處理步驟,這保證了數(shù)據(jù)的完整性。如果開(kāi)發(fā)人員和應(yīng)用程序都使用了同一存儲(chǔ)過(guò)程,則所使用的代碼是相同的。還有就是防止錯(cuò)誤,需要執(zhí)行的步驟越多,出錯(cuò)的可能性越大。防止錯(cuò)誤保證了數(shù)據(jù)的一致性。
????????3?簡(jiǎn)化對(duì)變動(dòng)的管理。如果表名、列名或業(yè)務(wù)邏輯有變化。只需要更改存儲(chǔ)過(guò)程的代碼,使用它的人員不會(huì)改自己的代碼了都。
????????4?提高性能,因?yàn)槭褂么鎯?chǔ)過(guò)程比使用單條SQL語(yǔ)句要快
????????5?存在一些職能用在單個(gè)請(qǐng)求中的MySQL元素和特性,存儲(chǔ)過(guò)程可以使用它們來(lái)編寫(xiě)功能更強(qiáng)更靈活的代碼
????????換句話說(shuō)3個(gè)主要好處簡(jiǎn)單、安全、高性能
缺點(diǎn)
????????1?一般來(lái)說(shuō),存儲(chǔ)過(guò)程的編寫(xiě)要比基本的SQL語(yǔ)句復(fù)雜,編寫(xiě)存儲(chǔ)過(guò)程需要更高的技能,更豐富的經(jīng)驗(yàn)。
????????2?你可能沒(méi)有創(chuàng)建存儲(chǔ)過(guò)程的安全訪問(wèn)權(quán)限。許多數(shù)據(jù)庫(kù)管理員限制存儲(chǔ)過(guò)程的創(chuàng)建,允許用戶使用存儲(chǔ)過(guò)程,但不允許創(chuàng)建存儲(chǔ)過(guò)程。
存儲(chǔ)過(guò)程使用對(duì)我這種菜雞來(lái)說(shuō)還是有些難度的,沒(méi)系統(tǒng)學(xué)過(guò),看了同事寫(xiě)的之后,大概看得懂,但是看到cursor游標(biāo)之后有些懵,特此總結(jié)與一下
?
使用游標(biāo)
????MySQL5添加了對(duì)游標(biāo)的支持
????只能用于存儲(chǔ)過(guò)程
?直接上一個(gè)已經(jīng)完善的存儲(chǔ)過(guò)程,用于對(duì)表數(shù)據(jù)的copy
?
DELIMITER $$USE `chy2019` $$DROP PROCEDURE IF EXISTS `copy_order_data` $$CREATE DEFINER = `root` @`%` PROCEDURE `copy_order_data` (IN p_source VARCHAR (100)) BEGIN-- 需要定義接收游標(biāo)數(shù)據(jù)的變量 DECLARE done BOOLEAN DEFAULT 0 ;-- 自定義變量DECLARE var_price DOUBLE DEFAULT NULL ;DECLARE var_pay_time TIMESTAMP DEFAULT NULL ;DECLARE var_product VARCHAR (100) DEFAULT NULL ;DECLARE var_source VARCHAR (100) DEFAULT NULL ;-- 聲明游標(biāo)DECLARE cur CURSOR FOR -- 作用于哪個(gè)語(yǔ)句SELECT price,pay_time,product,source FROMcms_aw_order WHERE source = p_source ;-- 設(shè)置結(jié)束標(biāo)志-- 這條語(yǔ)句定義了一個(gè) CONTINUE HANDLER,它是在條件出現(xiàn)時(shí)被執(zhí)行的代碼。這里,它指出當(dāng) SQLSTATE '02000'出現(xiàn)時(shí),SET done=1 。SQLSTATE '02000'是一個(gè)未找到條件,當(dāng)REPEAT由于沒(méi)有更多的行供循環(huán)而不能繼續(xù)時(shí),出現(xiàn)這個(gè)條件DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ;-- 打開(kāi)游標(biāo)OPEN cur ;-- 使用repeat循環(huán)語(yǔ)法REPEAT-- 批讀取數(shù)據(jù)到指定變量上FETCH cur INTO var_price,var_pay_time,var_product,var_source ;-- 進(jìn)行邏輯操作INSERT INTO cms_aw_order_copy (price, pay_time, product, source) VALUES(var_price,var_pay_time,var_product,var_source) ;-- 循環(huán)結(jié)束條件UNTIL done END REPEAT ;-- 關(guān)閉游標(biāo)CLOSE cur ; END $$DELIMITER ;簡(jiǎn)單易懂,而且也比較完善。
這個(gè)是對(duì)循環(huán)結(jié)束的條件設(shè)置。
SQLSTATE?'02000'是一個(gè)未找到條件,當(dāng)REPEAT由于沒(méi)有更多的行供循環(huán)而不能繼續(xù)時(shí),出現(xiàn)這個(gè)條件。
??? 關(guān)于MySQL 5使用的?MySQL錯(cuò)誤代碼列表,請(qǐng)參閱?http://dev.mysql.com/doc/mysql/en/error-handling.html?。
?
還有一種方式是使用
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1 ;總結(jié)
以上是生活随笔為你收集整理的MySQL存储过程和游标的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎样才算高并发?
- 下一篇: MySQL存储过程使用游标循环数据列表