代码:
delimiter $$
create procedure rename_table(in v_table_name varchar(255), in v_tmp_table_name varchar(255))
begin
declare temp_table_name varchar(255);
set temp_table_name = CONCAT(v_table_name, '_', date_format(current_date, '%Y%m%d'));
set @sql_str = concat('alter table ',v_table_name, ' rename to ', temp_table_name, ';');
prepare sql_str from @sql_str;
execute sql_str;
set @sql_str = concat('alter table ',v_tmp_table_name, ' rename to ', v_table_name, ';');
prepare sql_str from @sql_str;
execute sql_str;
set @sql_str = concat('alter table ',temp_table_name, ' rename to ', v_tmp_table_name, ';');
prepare sql_str from @sql_str;
execute sql_str;
deallocate prepare sql_str;
end
$$
delimiter ;
注意点:
若有存储过程如下:
drop procedure if exists selectByTableName;
create procedure selectByTableName(in tableName varchar(50))
begin
select * from tableName;
end;
在调用存储过程时会报错:
call selectByTableName('emp');
> 1146 - Table 'db_name.tablename' doesn't exist
> 时间: 0s
原因是它把变量 tableName 作为了表名,并不是把传入的值作为表名。 如果要解决上述问题的话,可以使用 concat 函数,然后用预处理语句出入动态表名来执行 sql,对于增删改查都适用。
将上述存储过程修改为:
drop procedure if exists selectByTableName;
create procedure selectByTableName(in tableName varchar(50))
begin
set @sql_str = concat('select * from ',tableName);
prepare sql_str from @sql_str ;
execute sql_str ;
deallocate prepare sql_str;
end;
再调用时就能正常查询出结果了。在预处理语句中,使用了用户变量,变量名是自定义的。
创建存储过程格式:
delimiter 自定义结束符号
create procedure sp_name([in, out, inout] 参数名 数据类型...)
begin
sql语句;
end
自定义结束符号
delimiter ;
调用存储过程:
call sp_name([参数|@参数]);
删除存储过程:
drop procedure sp_name;
参考文章: https://www.cnblogs.com/zys2019/p/15171722.html
|