您的位置:首页 > 数据库 > MySQL

mysql存储过程中如何调用变量作为表名

2014-04-15 13:54 537 查看
蓝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`; | +------------------------------------------------+
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息