Mysql 高級特性:游標與流程控制
Mysql 高級特性:游標與流程控制
最近研究了一下存儲過程的高級特性:游標與流程控制。以一個簡單的例子來說明,例子要達到的目的是這樣的:公司因為創建數據庫之初,將Mysql的存儲引擎設定為了MYISAM,這種引擎不支持主子表關聯,無法創建主外鍵,而且數據庫涉及到的表很多,手動更改很麻煩,需要借助一個存儲過程來批量修改。即:批量修改數據庫表的引擎類型。
這里首先創建一個測試的數據庫:testaaa,其包含如下表 and 初始數據庫引擎類型如下:</span>
- SELECT table_name,ENGINE FROM information_schema.TABLES WHERE table_schema='testaaa' ;
- </ol> </span>
- DELIMITER &&
- CREATE PROCEDURE changeEngineType(IN DB_NAME VARCHAR(32),IN Engine_type VARCHAR(16))
# 數據庫名稱,引擎類型 - BEGIN
- DECLARE done INT DEFAULT 0; # 游標的標志位
- DECLARE TB_NAME VARCHAR(64); # 數據庫的表名
- DECLARE COMMAND VARCHAR(64); # 更改數據庫引擎的命令
- DECLARE cur1 CURSOR FOR SELECT table_name FROM information_schema.TABLES WHERE table_schema=DB_NAME ;
- DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; #錯誤定義,標記循環結束
- OPEN cur1;
- REPEAT # 循環開始
- FETCH cur1 INTO TB_NAME;
- IF NOT done THEN
- SET COMMAND=CONCAT('ALTER TABLE ',DB_NAME,'.',TB_NAME,' ENGINE = ',Engine_type);
# 拼更改引擎的命令 ALTER TABLE test_3 ENGINE = MYISAM ; - SET @E=COMMAND;
- PREPARE stmt1 FROM @E;
- EXECUTE stmt1; # 執行命令
- DEALLOCATE PREPARE stmt1; # 釋放對象 deallocate prepare
- END IF;
- UNTIL done END REPEAT; # 循環結束
- CLOSE cur1; #關閉游標
- END;
- &&
- DELIMITER ; </ol>
- CALL changeEngineType('testaaa','MYISAM');
- CALL changeEngineType('testaaa','InnoDB');
- </ol>

需要把engine列變成InnoDB,創建腳本如下:
執行完成后,調用該存儲過程:

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