>데이터 베이스 >MySQL 튜토리얼 >mysql存储过程修改表的engine

mysql存储过程修改表的engine

WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB
WBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWBOYWB원래의
2016-06-07 15:46:571045검색

因公司需要将多个schema下所有使用MyISAM引用的表更改为InnoDB引擎,所以就定了个存储过程来实现 delimiter // --存储过程中可以使用分号 drop procedure if exists `alter_engine`// -- 若已存在则删除 create procedure `alter_engine`(in schema_name_in

因公司需要将多个schema下所有使用MyISAM引用的表更改为InnoDB引擎,所以就定了个存储过程来实现

 

delimiter // --存储过程中可以使用分号
drop procedure if exists `alter_engine`// -- 若已存在则删除
create procedure `alter_engine`(in schema_name_in varchar(30)) --输入参数:schema名称
begin
 declare alter_sql varchar(100); --用于获取游标查询生成的sql语句
 declare stop_flag int; --游标循环是否结束的标志

 

/*获取指定schema下面使用MyISAM engine的表 , 并直接组装成 alter table table_name engine = InnoDB的SQl语句*/
 declare table_name_cur cursor for select concat('alter table ',table_name,' ENGINE=InnoDB; ')
        from information_schema.tables where table_schema = schema_name_in and engine = 'MyISAM';
/*循环结束标志*/

 declare continue handler for not found set stop_flag = 1;

 set stop_flag = 0;

 open table_name_cur;
 repeat
  fetch table_name_cur into alter_sql;
   if stop_flag = 0 then
     /*prepare from 后面的变量必须是@开头*/

     set @alter_sql = alter_sql;
     prepare s1 from @alter_sql;
      execute s1;

/*显示回收s*/
     deallocate prepare s1;
            end if;
UNTIL stop_flag = 1
END REPEAT;
CLOSE table_name_cur;
END;
//

/*切换回系统默认的命令结束标志*/
delimiter ;

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.