mysql儲存過程之遊標
MySQL5 中添加了儲存過程的支援。
大多數 SQL語句都是針對一個或多個表的單條語句。並非所有的操作都怎麼簡單。經常會有一個完整的操作需要多條才能完成
儲存過程簡單來說,就是為以後的使用而儲存的一條或多條 MySQL語句的集合。可將其視為批檔案。雖然他們的作用不僅限於批處理。
為什麼要使用儲存過程:優點
1 通過吧處理封裝在容易使用的單元中,簡化複雜的操作
2 由於不要求反覆建立一系列處理步驟,這保證了資料的完整性。如果開發人員和應用程式都使用了同一儲存過程,則所使用的程式碼是相同的。還有就是防止錯誤,需要執行的步驟越多,出錯的可能性越大。防止錯誤保證了資料的一致性。
3 簡化對變動的管理。如果表名、列名或業務邏輯有變化。只需要更改儲存過程的程式碼,使用它的人員不會改自己的程式碼了都。
4 提高效能,因為使用儲存過程比使用單條 SQL語句要快
5 存在一些職能用在單個請求中的 MySQL元素和特性,儲存過程可以使用它們來編寫功能更強更靈活的程式碼
換句話說 3個主要好處簡單、安全、高效能
缺點
1 一般來說,儲存過程的編寫要比基本的 SQL語句複雜,編寫儲存過程需要更高的技能,更豐富的經驗。
2 你可能沒有建立儲存過程的安全訪問許可權。許多資料庫管理員限制儲存過程的建立,允許使用者使用儲存過程,但不允許建立儲存過程
儲存過程是非常有用的,應該儘可能的使用它們
儲存過程使用對我這種菜雞來說還是有些難度的,沒系統學過,看了同事寫的之後,大概看得懂,但是看到cursor遊標之後有些懵,特此總結與一下
使用遊標
MySQL5添加了對遊標的支援
只能用於儲存過程
直接上一個已經完善的儲存過程,用於對錶資料的copy
DELIMITER $$ USE `chy2019` $$ DROP PROCEDURE IF EXISTS `copy_order_data` $$ CREATE DEFINER = `root` @`%` PROCEDURE `copy_order_data` (IN p_source VARCHAR (100)) BEGIN -- 需要定義接收遊標資料的變數 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 ; -- 宣告遊標 DECLARE cur CURSOR FOR -- 作用於哪個語句 SELECT price, pay_time, product, source FROM cms_aw_order WHERE source = p_source ; -- 設定結束標誌 -- 這條語句定義了一個 CONTINUE HANDLER,它是在條件出現時被執行的程式碼。這裡,它指出當 SQLSTATE '02000'出現時,SET done=1 。SQLSTATE '02000'是一個未找到條件,當REPEAT由於沒有更多的行供迴圈而不能繼續時,出現這個條件 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1 ; -- 開啟遊標 OPEN cur ; -- 使用repeat迴圈語法 REPEAT -- 批讀取資料到指定變數上 FETCH cur INTO var_price, var_pay_time, var_product, var_source ; -- 進行邏輯操作 INSERT INTO cms_aw_order_copy (price, pay_time, product, source) VALUES ( var_price, var_pay_time, var_product, var_source ) ; -- 迴圈結束條件 UNTIL done END REPEAT ; -- 關閉遊標 CLOSE cur ; END $$ DELIMITER ;
簡單易懂,而且也比較完善。
這個是對迴圈結束的條件設定。
SQLSTATE '02000'是一個未找到條件,當REPEAT由於沒有更多的行供迴圈而不能繼續時,出現這個條件。
關於MySQL 5使用的 MySQL錯誤程式碼列表,請參閱 http://dev.mysql.com/doc/mysql/en/error-handling.html 。
還有一種方式是使用
DECLARE CONTINUE HANDLER FOR NOT FOUND SET no_more_products = 1 ;
這種方式試了下,沒成功,一種方式可以就行了,倘若以後有機會可以再操作。
到位。