数码鹭岛论坛

标题: mysql存储过程之cursor [打印本页]

作者: 翔子    时间: 2011-10-26 00:16
标题: mysql存储过程之cursor
  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;
复制代码

作者: 翔子    时间: 2011-10-26 00:18
标题: 嵌套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 ;
复制代码

作者: 翔子    时间: 2011-10-26 00:19
标题: 另一种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
复制代码





欢迎光临 数码鹭岛论坛 (http://www.clore.net/forum/) Powered by Discuz! X3.2