分享

MySQL中游标的使用

 魏正钦的图书馆 2015-05-19

简述:

这里主要研究一下,在Mysql中游标的使用,此外关注到游标使用过程中循环的调用写法


在testDB下有一个张person表,其中的成员如下图所示,


这里设计一个procedure,在这个函数中,使用到了Mysql中的游标,用于指向每一行的addr这一属性,然后把所有的addr属性合在一起,用分号分隔。

原先person表中的数据如下,

  1. select name,addr from person;  


下面是整个过程的实现SQL代码

实现写法1:

  1. drop procedure if exists useCursor ;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  8.     DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET oneAddr = null;  
  9.     OPEN curl;  
  10.     FETCH curl INTO oneAddr;  
  11.     WHILE(oneAddr is not null) DO  
  12.       set oneAddr = CONCAT(oneAddr, ';');  
  13.       set allAddr = CONCAT(allAddr, oneAddr);  
  14.       FETCH curl into oneAddr;  
  15.     END WHILE;  
  16.     CLOSE curl;  
  17.     SELECT allAddr;  
  18.   END;//  
  19. call useCursor();  


实现写法2:

  1. drop procedure if exists useCursor;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE done INT DEFAULT 0;  
  8.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  9.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  
  10.     OPEN curl;  
  11.     REPEAT  
  12.       FETCH curl INTO oneAddr;  
  13.       IF NOT done THEN  
  14.         set oneAddr = CONCAT(oneAddr, ';');  
  15.         set allAddr = CONCAT(allAddr, oneAddr);  
  16.       END IF;  
  17.     UNTIL done END REPEAT;  
  18.     CLOSE curl;  
  19.     select allAddr;  
  20.   END;//  
  21. call useCursor();  

实现写法3:

  1. drop procedure if exists useCursor;  
  2. delimiter //  
  3. CREATE PROCEDURE useCursor()  
  4.   BEGIN  
  5.     DECLARE oneAddr varchar(8) default '';  
  6.     DECLARE allAddr varchar(8) default '';  
  7.     DECLARE done bool DEFAULT false;  
  8.     DECLARE curl CURSOR FOR SELECT addr FROM test.person;  
  9.     DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = true;  
  10.     OPEN curl;  
  11.     personLoop: LOOP  
  12.       FETCH curl INTO oneAddr;  
  13.       IF done THEN  
  14.         LEAVE personLoop;  
  15.       ELSE  
  16.         set oneAddr = CONCAT(oneAddr, ';');  
  17.         set allAddr = CONCAT(allAddr, oneAddr);  
  18.       END IF;  
  19.     END LOOP personLoop;  
  20.     CLOSE curl;  
  21.     select allAddr;  
  22.   END;//  
  23. call useCursor();  


结果输出:




    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约