MySQL存储过程使用随手记0

实现功能

批量更新指定数据库中所有表的字符编码。

语句

BEGIN

DECLARE dynamicSql varchar(200);
DECLARE stop int default  0;
DECLARE mycursor CURSOR FOR
SELECT
	CONCAT('alter table ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as new_sql
FROM
	INFORMATION_SCHEMA.TABLES
WHERE
	TABLE_SCHEMA = 'rbc_store';/*rbc_store为数据库名*/
 /*这把 游标 异常后 捕捉
         *        并设置 循环使用 变量 stop 为 null 跳出循环。
*/
DECLARE CONTINUE HANDLER for SQLSTATE '02000' SET STOP = null;
OPEN mycursor;
FETCH mycursor into dynamicSql;
WHILE (stop is not null) DO
SET @v_sql = dynamicSql;
PREPARE stmt from @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
FETCH mycursor into dynamicSql;
END WHILE;
CLOSE mycursor;
END

用到的关键语法

1.声明游标

DECLARE mycursor CURSOR FOR
SELECT
	CONCAT('alter table ', TABLE_NAME, ' CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;') as new_sql
FROM
	INFORMATION_SCHEMA.TABLES
WHERE
	TABLE_SCHEMA = 'rbc_store';

2.循环语句

WHILE (条件) DO
END WHILE;

3.游标使用

OPEN mycursor;
FETCH mycursor into 变量;
CLOSE mycursor;

4.Declare ...Handler语法

DECLARE CONTINUE HANDLER for SQLSTATE '02000' SET STOP = null;

该语句指的是,定义一个处理器handler,该处理器针对存储过程出现状态为SQLSTATE '02000'的异常,做相应的处理即为stop变量赋值为null。
其中 CONTINUE是处理器类型,SQLSTATE '02000' 为异常描述,指游标操作中找不到数据,“set stop=null”为异常处理语句,也可以是以begin..end 结尾的语句块。

5.动态sql语句的执行

SET @v_sql = dynamicSql;
PREPARE stmt from @v_sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

要动态执行sql语句,必须采用预编译的语法。即使用prepare关键字和execute关键字。

posted @ 2016-08-29 18:09  braveliu.site  阅读(124)  评论(0编辑  收藏  举报