主页 > 知识库 > 数据库 > SQL server >

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

来源:eNet硅谷动力 作者:网络 发表于:2012-07-06 10:47  点击:
MySQL的存储过程不好用,一般在应用开发过程中不建议使用。但有时候在数据迁移等环境中,特别涉及到复杂点的逻辑处理,就需要存储过程的配合了,当然,用其他语言写程序实现也是可以的,不过效率估计没有直接在数据库中操作高。 有时候数据所在的表是不确定的
MySQL的存储过程不好用,一般在应用开发过程中不建议使用。但有时候在数据迁移等环境中,特别涉及到复杂点的逻辑处理,就需要存储过程的配合了,当然,用其他语言写程序实现也是可以的,不过效率估计没有直接在数据库中操作高。
  有时候数据所在的表是不确定的,需要根据实际情况临时决定表名,这时候就是动态SQL的用武之地了,以下示例展示了在一次数据导出的过程中使用动态SQL的存储过程例子:
双击代码全选
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
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 ;

    有帮助
    (1)
    50%
    没帮助
    (1)
    50%