设为首页收藏本站

数码鹭岛论坛

 找回密码
 注-册

QQ登录

只需一步,快速开始

搜索
查看: 2790|回复: 2
打印 上一主题 下一主题

mysql存储过程之cursor

[复制链接]
跳转到指定楼层
1#
发表于 2011-10-26 00:16:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. CREATE PROCEDURE curdemo()
  2. BEGIN
  3.   DECLARE done INT DEFAULT 0;
  4.   DECLARE a CHAR(16);
  5.   DECLARE b,c INT;
  6.   DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  7.   DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
  8.   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

  9.   OPEN cur1;
  10.   OPEN cur2;

  11.   read_loop: LOOP
  12.     FETCH cur1 INTO a, b;
  13.     FETCH cur2 INTO c;
  14.     IF done THEN
  15.       LEAVE read_loop;
  16.     END IF;
  17.     IF b < c THEN
  18.       INSERT INTO test.t3 VALUES (a,b);
  19.     ELSE
  20.       INSERT INTO test.t3 VALUES (a,c);
  21.     END IF;
  22.   END LOOP;

  23.   CLOSE cur1;
  24.   CLOSE cur2;
  25. END;
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享分享
2#
 楼主| 发表于 2011-10-26 00:18:33 | 只看该作者

嵌套cursor的例子

这里用一个临时cur2做暂存
  1. DROP PROCEDURE IF EXISTS get_major_info_for_all_dept;

  2. DELIMITER //
  3. -- Create procedure get_major_info_for_all_dept()
  4. CREATE PROCEDURE get_major_info_for_all_dept()

  5. BEGIN

  6. DECLARE dept_id VARCHAR(3) ;
  7. DECLARE major_description VARCHAR(50) ;
  8. DECLARE concat_description VARCHAR(60);
  9. DECLARE flag1 VARCHAR(5) DEFAULT 'START' ;
  10. DECLARE flag2 VARCHAR(5) DEFAULT 'START' ;

  11. -- Declare cursor for outside looping purpose to get all departments from the dept table
  12. DECLARE getDept CURSOR FOR
  13. SELECT deptid
  14. FROM dept
  15. ORDER BY deptid;
  16. --Declare cursor for getting each and every major description of each department.
  17. DECLARE getMajorsFromEachDept CURSOR FOR
  18. SELECT description
  19. FROM major
  20. WHERE deptid = dept_id;

  21. -- Record not found means for inner loop no more major record left for that dept_id and for outer loop no more record left for dept-id
  22. DECLARE CONTINUE HANDLER FOR NOT FOUND SET flag1 = 'END';

  23. -- Open cursor
  24. OPEN getDept;

  25. -- loop to extract each major of each department and insert into messages table
  26. -- until no record left.

  27. WHILE flag1<>'END' DO
  28. -- to get deptid
  29. FETCH getDept INTO dept_id;

  30. IF flag1 <> 'END' THEN

  31. OPEN getMajorsFromEachDept;

  32. SET flag2= flag1;
  33. WHILE flag1 <> 'END' DO
  34. FETCH getMajorsFromEachDept INTO major_description;
  35. IF flag1 <> 'END' THEN
  36. SET concat_description = CONCAT(dept_id,'*',major_description);
  37. INSERT INTO messages
  38. VALUES (concat_description);
  39. END IF;
  40. END WHILE;
  41. -- free memory
  42. CLOSE getMajorsFromEachDept;

  43. SET flag1 = flag2;
  44. END IF;
  45. END WHILE;
  46. -- Loop end.

  47. -- free memory
  48. CLOSE getDept;

  49. --- Display all records of Messages Table---------
  50. SELECT * FROM messages;

  51. END;
  52. //

  53. DELIMITER ;
复制代码
3#
 楼主| 发表于 2011-10-26 00:19:15 | 只看该作者

另一种cursor方案

  1. CREATE PROCEDURE curdemo()
  2. BEGIN
  3.   DECLARE a CHAR(16);
  4.   DECLARE b,c INT;
  5.   DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
  6.   DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;

  7.   OPEN cur1;
  8.   OPEN cur2;

  9.   BEGIN
  10.     DECLARE EXIT HANDLER FOR NOT FOUND BEGIN END;
  11.     LOOP
  12.       FETCH cur1 INTO a, b;
  13.       FETCH cur2 INTO c;
  14.       IF b < c THEN
  15.         INSERT INTO test.t3 VALUES (a,b);
  16.       ELSE
  17.         INSERT INTO test.t3 VALUES (a,c);
  18.       END IF;
  19.     END LOOP;
  20.   END;

  21.   CLOSE cur1;
  22.   CLOSE cur2;
  23. END
复制代码
您需要登录后才可以回帖 登录 | 注-册

本版积分规则

小黑屋|手机版|Archiver|数码鹭岛 ( 闽ICP备20006246号 )  

counter

GMT+8, 2025-12-4 03:14 , Processed in 0.074313 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表