• mysql 游标使用


    请使用 mysql 1.5 或以上version;

    测试表 level ;

     

    create table test.level (name varchar(20));

     再 insert 些数据 ;

     

    复制代码
    代码
     /*初始化*/ 
     
    drop procedure if exists  useCursor // 
       
     
    /*建立 存储过程 create */ 
     
    CREATE PROCEDURE useCursor()
        
    BEGIN
        
    /*局部变量的定义 declare*/ 

             
    declare tmpName varchar(20default '' ;

             
    declare allName varchar(255default '' ;

             
    declare cur1 CURSOR FOR SELECT name FROM test.level ;

             
    /*    mysql 不知道为什么用异常加入判断 ?

              *    此请参考官方文档 20.2.11. 光标 光标 

              *        这把 游标 异常后 捕捉 

              *        并设置 循环使用 变量 tmpname 为 null 跳出循环。

              
    */

             
    declare CONTINUE HANDLER FOR SQLSTATE '02000' SET tmpname = null;
      

        
    /*开游标*/ 

         
    OPEN cur1;

             
    /*游标向下走一步*/ 

             
    FETCH cur1 INTO tmpName;

             
    /* 循环体 这很明显 把游标查询出的 name 都加起并用 ; 号隔开 */

          
    WHILE ( tmpname is not null) DO

              
    set tmpName = CONCAT(tmpName ,";") ;

              
    set allName = CONCAT(allName ,tmpName) ;

            
    /*游标向下走一步*/ 

            
    FETCH cur1 INTO tmpName;

          
    END WHILE;

          
    CLOSE cur1;


        
    select allName ;

    END;//

    call useCursor()
    //
    复制代码

     

    运行结果:

     

    复制代码
    代码
    mysql> call useCursor()//

    +--------------------------------------+

    | allName                              |

    +--------------------------------------+

    | f1;c3;c6;c5;c2;c4;c1;f1;f3;f4;f2;f5; |

    +--------------------------------------+

    1 row in set (0.00 sec)
    复制代码

     

    复制代码
    代码
    DELIMITER $$  
      
    DROP PROCEDURE IF EXITS cursor_example$$  
    CREATE PROCEDURE cursor_example()  
         READS SQL DATA  
    BEGIN  
         
    DECLARE l_employee_id INT;  
         
    DECLARE l_salary NUMERIC(8,2);  
         
    DECLARE l_department_id INT;  
         
    DECLARE done INT DEFAULT 0;  
         
    DECLARE cur1 CURSOR FOR SELECT employee_id, salary, department_id FROM employees;  
         
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;  
      
         
    OPEN cur1;  
         emp_loop: LOOP  
             
    FETCH cur1 INTO l_employee_id, l_salary, l_department_id;  
             
    IF done=1 THEN  
                 LEAVE emp_loop;  
             
    END IF;  
         
    END LOOP emp_loop;  
         
    CLOSE cur1;  
    END$$  
    DELIMITER ;  
    复制代码


     

    复制代码
    代码
    /*创建过程*/
    DELIMITER 
    //
    DROP PROCEDURE IF EXISTS test //
    CREATE PROCEDURE test()
    BEGIN
        
    DECLARE done INT DEFAULT 0;
        
    DECLARE a VARCHAR(200DEFAULT '';
        
    DECLARE c VARCHAR(200DEFAULT '';
        
        
    DECLARE mycursor CURSOR FOR SELECT  fusername FROM uchome_friend;
        
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done=1;
        
        
    OPEN mycursor;
        
        REPEAT 
            
    FETCH mycursor INTO a;
            
    IF NOT done THEN
                
    SET c=CONCAT(c,a);/*字符串相加*/
            
    END IF;
            
        UNTIL done 
    END REPEAT;
        
        
    CLOSE mycursor;
        
        
    SELECT c;
    END //
    DELIMITER ;
    复制代码

     转载  http://www.cnblogs.com/qiantuwuliang/archive/2010/03/17/1687975.html

  • 相关阅读:
    忙碌进度条
    WPF异步调用WCF
    Oracle 数据类型及存储方式(二)
    C# 与Oracle Data Type Mappings
    【CEO来信】任正非寄语2010:开放、妥协与灰度
    数据库数据类型
    asccii 表
    SQlServer2008 表结构查询
    Oracle 数据类型及存储方式(六)
    应用特征备份
  • 原文地址:https://www.cnblogs.com/future2012lg/p/2989633.html
Copyright © 2020-2023  润新知