免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3860 | 回复: 3
打印 上一主题 下一主题

一个嵌套游标的引发事儿:MySQL存储过程so power!!! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-07-28 22:24 |只看该作者 |倒序浏览
本帖最后由 justin033 于 2010-07-28 22:30 编辑

如下这存储过程的body部分,问题:

如何把游标cur_1查出来的表名table_name值循环作为游标cur_2中的SQL语句from的表名

  1. begin
  2. declare l_str1 varchar(30) default ''; # table_name
  3. declare l_str2 int default 0;          # user_id
  4. declare l_str3 int default 0;          # count++
  5. declare l_str4 int default 0;          # router_id
  6. declare db_table varchar(30) default '';
  7. declare l_last_row_fetched int default 0;

  8. declare cur_1 cursor for select distinct table_name from userlib.ul_user_router
  9.    where db_name='userlib' and table_name like 'ul_users_%';

  10. declare cur_2 cursor for select user_id from db_table;

  11. DECLARE CONTINUE HANDLER FOR NOT FOUND SET l_last_row_fetched=1;

  12. open cur_1;

  13. cur1_loop: loop
  14. fetch cur_1 into l_str1;

  15. if  l_last_row_fetched=1 then
  16. leave cur1_loop;

  17. else
  18.   set db_table=concat('userlib.',l_str1);
  19.   select router_id into l_str4 from userlib.ul_user_router where table_name=l_str1;
  20. end if;

  21. open cur_2;

  22. set l_last_row_fetched=0;

  23. cur2_loop: loop
  24. fetch cur_2 into l_str2;

  25. if  l_last_row_fetched=1 then
  26. leave cur2_loop;

  27. else
  28.    set l_str3=l_str3+1;
  29.    if l_str3>110000 then
  30.    leave cur2_loop;
  31.    
  32.    else
  33.    insert into userlib.ul_company(user_id,router_id,title) select l_str2 as user_id, l_str4 as router_id, title
  34.                            from ztest.tmp_title where auto_id=floor(1 + rand() * 147);
  35.        
  36.    end if;
  37.                            
  38. end if;

  39. end loop cur2_loop;
  40. close cur_2;

  41. set l_last_row_fetched=0;

  42. end loop cur1_loop;
  43. close cur_1;

  44. end
复制代码
游标cur_1
declare cur_1 cursor for select distinct table_name from userlib.ul_user_router
   where db_name='userlib' and table_name like 'ul_users_%';


游标cur_2
declare cur_2 cursor for select user_id from db_table;

  set db_table=concat('userlib.',l_str1);


等候佳音。。。

论坛徽章:
9
每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00每日论坛发贴之星
日期:2016-01-04 06:20:00数据库技术版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00IT运维版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00综合交流区版块每日发帖之星
日期:2016-01-04 06:20:00数据库技术版块每周发帖之星
日期:2016-03-07 16:30:25
2 [报告]
发表于 2010-07-29 11:19 |只看该作者
感觉上应该可以用procedure嵌套来代替cursor嵌套,毕竟procedure接受参数,cursor 没有办法动态declare

论坛徽章:
0
3 [报告]
发表于 2010-07-29 11:24 |只看该作者
如下这存储过程的body部分,问题:

如何把游标cur_1查出来的表名table_name值循环作为游标cur_2中的SQL语 ...
justin033 发表于 2010-07-28 22:24



    没看出来power在哪儿,慢得很。。。

论坛徽章:
0
4 [报告]
发表于 2010-07-29 15:32 |只看该作者
回复 2# cenalulu


    估计没办法实现,因为变量好像不能作为select from xxx中的表名xxx。算了,叫我们程序员写代码了。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP