美文网首页mysqlMySQL
MySQL——使用游标(十七)

MySQL——使用游标(十七)

作者: 开心糖果的夏天 | 来源:发表于2017-06-28 17:53 被阅读67次

    MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 最流行的关系型数据库管理系统,在 WEB 应用方面MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

    MySQL是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。

    MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,它分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。由于其社区版的性能卓越,搭配 PHP 和 Apache 可组成良好的开发环境。

    一、游标

    有时,需要在检索出来的行中前进或者后退一行或多行。这就是使用游标的原因。游标是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

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

    二、使用游标

    使用游标及几个明确的步骤:
    (1)在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。
    (2)一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。
    (3)对于填有数据的游标,根据需要取出(检索)各行。
    (4)在结束游标使用时,必须关闭游标

    1.创建游标

    游标用DECLARE语句创建。DECLARE命名游标,并定
    义相应的SELECT语句,根据需要带WHERE和其他子句。例如,以下语句定义了名为ordernumbers的游标,使用了可以检索所有订单的SELECT语句。

    CREATE PROCEDURE processorders()
    BEGIN
           DECLARE ordernumbers CURSOR
           FOR
           SELECT order_num FROM orders;
    END;
    

    DECLARE语句用来定义和命名游标,这里为ordernumbers。存储过程处理完成后,游标就消失(因为它局限于存储过程)。

    2.打开和关闭游标

    游标用OPEN CURSOR语句来打开:

    OPEN ordernumbers;
    

    在处理OPEN语句时执行查询,存储检索出的数据以供浏览和滚动。游标处理完成后,应该使用如下语句关闭游标:

    CLOSE ordernumbers;
    

    下面是上述例子的修改版本:

    CREATE PROCEDURE processorders()
    BEGIN
           DECLARE ordernumbers CURSOR
           FOR
           SELECT order_num FROM orders;
    
           OPEN ordernumbers;
    
           CLOSE ordernumbers;
    END;
    

    这个存储过程声明、打开和关闭一个游标。但对检索出来的数据什么也没做。

    3.使用游标数据

    从游标中检索单个行(第一行):

    CREATE PROCEDURE processorders()
    BEGIN
         DECLARE o INT;
         DECLARE ordernumbers CURSOR
         FOR
         SELECT order_num FROM orders;
    
         OPEN ordernumbers;
         FETCH ordernumbers INTO o;
         CLOSE ordernumbers;
    END;
    

    其中FETCH用来检索当前行的order_num列(将自动从第一行开始)到一个名为o的局部声明的变量中。对检索出来的数据不做任何处理。

    循环检索数据,从第一行到最后一行:

    CREATE PROCEDURE processorders()
    BEGIN
         DECLARE done BOOLEAN DEFAULT 0;
         DECLARE o INT;
         DECLARE ordernumbers CURSOR
         FOR
         SELECT order_num FROM orders;
         DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    
         OPEN ordernumbers;
         REPEAT
            FETCH ordernumbers INTO o;
         UNTIL done END REPEAT;
         CLOSE ordernumbers;
    END;
    

    其中FETCH用来检索当前行的order_num列到一个名为o的局部声明的变量中。FETCH在REPEAT内,因此它反复执行直到done为真(由UNTIL done END REPEAT;规定)。为了使它起作用,用一个DEFAULT 0(假,不结束)定义变量done。以下的语句可以将done设置为真:

    DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;
    

    这条语句定义了一个DECLARE CONTINUE,它是在条件出现时被执行的代码。这里,它指出当SQLSTATE '02000' 出现时,SET done=1。SQLSTATE '02000' 是一个未找到条件。当REPEAT由于没有更多的行供循环而不能继续时,出现这个条件。

    如果调用这个存储过程,它将定义几个变量和一个CONTINUE HANDLER,定义并打开一个游标,重复读取所有行,然后关闭游标。如果一切正常,可以在循环内放入任意需要的处理(在 FETCH 语句之后,循环结束之前)。

    相关文章

      网友评论

        本文标题:MySQL——使用游标(十七)

        本文链接:https://www.haomeiwen.com/subject/qeekcxtx.html