zoukankan      html  css  js  c++  java
  • MySql必知必会实战练习(六)游标

      游标主要用于交互式应用,滚动屏幕上的数据,并对数据进行浏览或做出更改

      看一下下面的例子:

    drop procedure IF EXISTS processorders;
    create procedure processorders(
        out ordernum int
    )
    begin
        select order_num from orders into ordernum;
    end;
    
    call processorders(@ordernum);
    select ordernum;

      输出:

      

      由于结果为多行无法显示,这时我们就需要使用游标来操作

     1. 游标基本方法

    (1)创建游标

    create procedure processorders()
    begin
        declare ordernums cursor
        for
        select order_num from orders;
    end;

     (2)打开游标

    open ordernums;

    (3)关闭游标

    close ordernums;

      在一个游标关闭后,如果没有重新打开,则不能使用它。

      使用申明过的游标不需要再次声明,用open语句打开它就可以了。

    2.游标使用示例

    drop procedure IF EXISTS processorders;
    create procedure processorders(
        out numbers int,
        out custid int
    )
    begin
        #声明游标
        declare ordernums cursor
        for
        select order_num,cust_id from orders;
        
        #打开游标
        open ordernums;
        
        #用来检索当前行的order_num(自动从第一行开始)
        fetch ordernums into numbers, custid;  
        
        #关闭游标
        close ordernums;
    end;
    
    call processorders(@numbers,@custid);
    select @numbers,@custid;

       会看到只输出了第一行的order_num和cust_id:

      继续,接下来将循环检索数据,从第一行到最后一行:

    drop procedure IF EXISTS processorders;
    create procedure processorders(
        out numbers int,
        out custid int
    )
    begin
        declare done boolean default 0;
        #声明游标
        declare ordernums cursor
        for
        select order_num,cust_id from orders;
        
        #声明CONTINUE HANDLER
        declare CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1;
        
        #打开游标
        open ordernums;
        
        #开始循环
        REPEAT
            #用来检索当前行的order_num(自动从第一行开始)
            fetch ordernums into numbers, custid;  
            
            #.....这里可以对每次检索出来的数据进行处理
            
        #结束循环
        UNTIL done END REPEAT;
        
        #关闭游标
        close ordernums;
    end;
    
    call processorders(@numbers,@custid);
    select @numbers,@custid;

       我们会看出输出最后一行的order_num和cust_id

      这样就实现了数据的循环检索,我们可以在 (#.....这里可以对每次检索出来的数据进行处理)注释处对每次检索出来的数据进行处理

      注意:上面我们定义了一个COUNtINUE HANDLEr,它是在条件出现时执行的代码,它指出SQLSTATE '02000'出现时set done = 1,最开始SQLSTATE '02000'是一个未找到的条件,只有当repeat没有更多的行供循环时才会出现SQLSTATE '02000'

  • 相关阅读:
    如何上传整个项目或者是文件夹到github
    阅读笔记16-架构师推荐:提高90%开发效率的工具推荐
    阅读笔记15-这些普通的程序猿,如今都已进阶成为技术大佬
    python爬虫——爬取淘票票正在热映电影
    阅读笔记12-Java 面试题 —— 老田的蚂蚁金服面试经历
    SOA架构设计案例分析
    阅读笔记11-孤独后厂村:30万互联网人跳不出的中国硅谷
    阅读笔记09-Java程序员必备的Intellij插件
    阅读笔记08-程序员依然是这个时代,贫寒学子翻身的不二选择
    os.path.join()
  • 原文地址:https://www.cnblogs.com/xiaobingqianrui/p/10030423.html
Copyright © 2011-2022 走看看