zoukankan      html  css  js  c++  java
  • mysql数据库游标问题

    【MySQL】游标的具体使用详解

    测试表 level ;

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

    再 insert 些数据 ;代码,初始化

    drop procedure if exists useCursor //

    建立 存储过程 create

    CREATE PROCEDURE useCursor()
    BEGIN

    局部变量的定义 declare

    declare tmpName varchar(20) default ''declare allName varchar(255) default ''declare cur1 CURSOR FOR SELECT name FROM test.level ;  

    MySQL 游标 异常后 捕捉

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

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

    开游标

    OPEN cur1;

    游标向下走一步

    FETCH cur1 INTO tmpName;

    循环体 这很明显 把MySQL 游标查询出的 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)
    复制代码

    While循环:

    复制代码
    WHILE expression DO
        Statements;
    END WHILE
    //实例
    DECLARE num INT;
    DECLARE my_string  VARCHAR(255);
    SET num =1;
    SET str ='';
      WHILE num  < span>10DO
    SET  my_string =CONCAT(my_string,num,',');
    SET  num = num +1;
    END WHILE;
    复制代码

    loop循环游标:

    复制代码
    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 ;  
    复制代码

    repeat循环游标:

    复制代码
    /*创建过程*/
    DELIMITER //
    DROP PROCEDURE IF EXISTS test //
    CREATE PROCEDURE test()
    BEGIN
        DECLARE done INT DEFAULT 0;
        DECLARE a VARCHAR(200) DEFAULT '';
        DECLARE c VARCHAR(200) DEFAULT '';
    
        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 ;
    复制代码
    复制代码
    /*******************************************循环语句************************************************/
    /*(1).WHILE循环*/
     [ label: ]   WHILE  expression DO
     statements
     END   WHILE   [ label ] ;
    /*(2).LOOP循环*/
     [ label: ]  LOOP
      statements
      END  LOOP  [ label ] ;
    /*(3).REPEAT UNTIL循环*/
     [ label: ]  REPEAT
     statements
     UNTIL expression
     END  REPEAT  [ label ] ;
  • 相关阅读:
    Centos6.4 cobbler安装要点
    zabbix oracle监控插件orabbix部署安装
    CPP
    基于curl 的zabbix API调用
    oracle 存储过程
    sqlplus乱码
    Intent之对象传递(Parcelable传递对象和对象集合)
    IOS压缩解压缩
    深入浅出java静态代理和动态代理
    c语言用rand() 函数,实现random(int m)
  • 原文地址:https://www.cnblogs.com/123fantao/p/8919327.html
Copyright © 2011-2022 走看看