日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > 数据库 >内容正文

数据库

MySQL存储过程和游标

發(fā)布時(shí)間:2024/4/13 数据库 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL存储过程和游标 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。