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 ;

這種方式試了下,沒成功,一種方式可以就行了,倘若以后有機會可以再操作。

到位。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM