--//创建存储过程前先检查是否存在,存在就删除,这个可以忽略DROPPROCEDUREIFEXISTS staff_zt_test;--//存储过程CREATEPROCEDUREstaff_zt_test()BEGIN--//该变量用于标识是否还有数据需遍历DECLARE flag INTDEFAULT0;--//创建一个变量用来存储遍历过程中的值DECLARE tmp_id varchar(100);--//模糊获取数据库表名,这里不能使用show table进行获取,只能select
declare idList CURSORFOR(select table_name from information_schema.tables where TABLE_SCHEMA='database' and table_name like 'table_%');--//查询是否有下一个数据,没有将标识设为1,相当于hasNextDECLARECONTINUEHANDLERFORNOTFOUNDSET flag =1;--//打开游标OPEN idList;--//取值设置到临时变量中FETCH idList INTO tmp_id;--//遍历未结束就一直执行WHILE flag !=1DO-- targetSQL //你想要执行的目标功能,这里可以写多个SQL--// 注意--//这里有一个坑,目标语句引用临时变量,实测发现不需要加@符号,但是搜索到的结果都是例如:@id ,这样来使用,实测发现无法取到数据//判断数据库是否有该字段IFNOTEXISTS(SELECT1FROMINFORMATION_SCHEMA.COLUMNSWHERETABLE_NAME= tmp_id
ANDCOLUMN_NAME='column')THEN//在column2后面添加column字段//这里有一个坑,如果变量为表名会获取不到变量的值,只能通过拼接sql来执行set @sql=concat('alter table ',tmp_id,' add column VARCHAR(64) DEFAULT NULL AFTER column2');PREPARE stmt from @sql;
execute stmt;ENDIF;--//一定要记得把游标向后移一位FETCH idList INTO tmp_id;ENDWHILE;CLOSE idList;END;