在MySQL的存储过程里使用动态SQL

MySQL的存储过程不好用,一般在应用开发过程中不建议使用。但有时候在数据迁移等环境中,特别涉及到复杂点的逻辑处理,就需要存储过程的配合了,当然,用其他语言写程序实现也是可以的,不过效率估计没有直接在数据库中操作高。

有时候数据所在的表是不确定的,需要根据实际情况临时决定表名,这时候就是动态SQL的用武之地了,以下示例展示了在一次数据导出的过程中使用动态SQL的存储过程例子:

delimiter //
CREATE PROCEDURE `proc_rt_imp_group`()
BEGIN
DECLARE done INT DEFAULT FALSE;
declare v_tid,v_ptable int;
declare v_tablename VARCHAR(32);
DECLARE cur_t CURSOR FOR select t.tid,t.ptable from pw_threads_rt t;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

OPEN cur_t;
read_loop: LOOP
FETCH cur_t INTO v_tid,v_ptable;
IF done THEN
LEAVE read_loop;
END IF;
if v_ptable=0 then
set v_tablename = ‘pw_posts’;
else
set v_tablename = concat(‘pw_posts’,v_ptable);
end if;
set @updatesql =CONCAT(‘insert into pw_posts_rt select * from ‘,v_tablename,’ where tid= ‘,v_tid);
PREPARE sqltext from @updatesql;
execute sqltext;
END LOOP;
CLOSE cur_t;
END//
delimiter ;

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>