Mysql 高級特性:游標與流程控制

Yangcl 10年前發布 | 68K 次閱讀


Mysql 高級特性:游標與流程控制

    最近研究了一下存儲過程的高級特性:游標與流程控制。以一個簡單的例子來說明,例子要達到的目的是這樣的:公司因為創建數據庫之初,將Mysql的存儲引擎設定為了MYISAM,這種引擎不支持主子表關聯,無法創建主外鍵,而且數據庫涉及到的表很多,手動更改很麻煩,需要借助一個存儲過程來批量修改。即:批量修改數據庫表的引擎類型。
這里首先創建一個測試的數據庫:testaaa,其包含如下表 and 初始數據庫引擎類型如下:</span>

  1. SELECT table_name,ENGINE FROM information_schema.TABLES WHERE table_schema='testaaa' ;   
  2.  
  3. </ol> </span>


    需要把engine列變成InnoDB,創建腳本如下:

    1. DELIMITER &&  
    2. CREATE PROCEDURE changeEngineType(IN DB_NAME VARCHAR(32),IN Engine_type VARCHAR(16))   
        # 數據庫名稱,引擎類型  
    3. BEGIN  
    4.   DECLARE done INT DEFAULT 0;  # 游標的標志位  
    5.   DECLARE TB_NAME VARCHAR(64); # 數據庫的表名  
    6.   DECLARE COMMAND VARCHAR(64); # 更改數據庫引擎的命令  
    7.   DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ;  
    8.   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; #錯誤定義,標記循環結束   
    9.   OPEN cur1;  
    10.   REPEAT # 循環開始  
    11.     FETCH cur1 INTO TB_NAME;  
    12.     IF NOT done THEN        
    13.        SET COMMAND=CONCAT('ALTER TABLE ',DB_NAME,'.',TB_NAME,' ENGINE = ',Engine_type); 
              # 拼更改引擎的命令 
      ALTER TABLE test_3 ENGINE = MYISAM ;  
    14.        SET @E=COMMAND;   
    15.        PREPARE stmt1 FROM @E;   
    16.           EXECUTE stmt1;              # 執行命令             
    17.           DEALLOCATE PREPARE stmt1;   # 釋放對象 deallocate prepare  
    18.     END IF;  
    19.   UNTIL done END REPEAT;  # 循環結束  
    20.   CLOSE cur1; #關閉游標  
    21. END;  
    22. &&  
    23. DELIMITER ;   
    24. </ol>
      執行完成后,調用該存儲過程:

      1.   
      2. CALL changeEngineType('testaaa','MYISAM');  
      3.   
      4. CALL changeEngineType('testaaa','InnoDB');  
      5.   
      6. </ol>


        從上表可以看出,每個數據表的類型都已經改變。






 本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!