蓝1的需求,定时将15天前的manager_info_‘日期’表删除。
这个需求从操作系统端也可以实现,只要利用rm写一个脚本即可,很方便。
但是如果数据库的表文件没有使用独立表空间,或者在没有操作系统文件权限的情况下,dba就需要在数据库的角度,利用存储过程来实现了。

在编写过程中要注意: 简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名。

在其他的关系型数据库中也是如此,mysql的解决方法是将整条sql语句作为变量,其中穿插变量作为表名,然后用sp_executesql调用该语句。
这在mysql5.0之前是不行的,5.0之后引入了一个全新的语句,可以达到类似sp_executesql的功能(仅对procedure有效,function不支持动态查询)语法如下:
PREPARE statement_name FROM preparable_SQL_statement; /*定义*/

EXECUTE statement_name [USING @var_name [, @var_name] ...]; /*执行预处理语句*/

{DEALLOCATE | DROP} PREPARE statement_name /*删除定义*/ ;


附存储过程代码:

DROP PROCEDURE IF EXISTS `pro_deltable`;
DELIMITER ;;

CREATE PROCEDURE pro_deltable ()

BEGIN
   DECLARE X VARCHAR(50);
   SET @X = concat ('drop table test','.','`','manager_info_',DATE_FORMAT(date_add(curdate(),interval -2 day),'%Y-%m-%d'),'`',';');
   insert into test.v1 values(@X);
   PREPARE DS from @X;
   execute DS;
   END
;;
DELIMITER ;;

在以上的例子中就是把@X作为整条sql传入DS,调用DS。
最后达到删除test库中的manager_info_2014-02-09表

mysql> select * from v1;
+------------------------------------------------+
| id                                                                      |
+------------------------------------------------+
| drop table test.`manager_info_2014-02-10`;  |
+------------------------------------------------+