zoukankan      html  css  js  c++  java
  • mysql 必知必会整理—游标[十四]

    前言

    简单介绍一下游标。

    正文

    需要MySQL 5 MySQL 5添加了对游标的支持,因此,本章内容适用于MySQL 5及以后的版本。
    

    有时,需要在检索出来的行中前进或后退一行或多行。这就是使用游标的原因。

    游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的结果集。

    在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。

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

    只能用于存储过程 不像多数DBMS,MySQL游标只能用于存储过程(和函数)
    

    使用说明

    使用游标涉及几个明确的步骤。

    1. 在能够使用游标前,必须声明(定义)它。这个过程实际上没有检索数据,它只是定义要使用的SELECT语句。

    2. 一旦声明后,必须打开游标以供使用。这个过程用前面定义的SELECT语句把数据实际检索出来。

    3. 对于填有数据的游标,根据需要取出(检索)各行。

    4. 在结束游标使用时,必须关闭游标。

    在声明游标后,可根据需要频繁地打开和关闭游标。在游标打开后,可根据需要频繁地执行取操作。

    DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句。

    例如,下面的语句定义了名为ordernumbers的游标,使用了可以检索所有订单的SELECT语句。

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

    这里只是定义了但是并没有使用。

    然后我们将其删除:

    DROP PROCEDURE processorders
    

    从新创建一个完整的例子。

    create PROCEDURE processorders()
    BEGIN
         DECLARE done Boolean DEFAULT 0;
         DECLARE o INT;
         DECLARE t DECIMAL(8,2);
         -- DECLARE the CURSOR
         DECLARE ordernumbers CURSOR
         FOR
         SELECT order_num FROM orders;
         -- DECLARE conitnue handle
         DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1;
         -- Create a table to store the results
         CREATE TABLE if not EXISTS ordertotals
         (
             order_num INT,
             total DECIMAL(8,2)
         );
         -- open the CURSOR
         OPEN ordernumbers;
         -- loop through all rows
         REPEAT
               -- Get order number
              FETCH ordernumbers into o;
              -- Get the total for this order
              CALL ordertotal(o,1,t);
              -- INSERT orderr and total into ordertotals
              INSERT INTO ordertotals(order_num, total)
              VALUES(o,t);
         -- end REPEAT
         UNTIL done END REPEAT;
         -- close the CURSOR
         CLOSE ordernumbers;
    END;
    

    这是一个相对简单的例子。

    首先定义了一个ordernumbers。

    然后DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done =1; 定义了一个触发条件,当 SQLSTATE '02000'的时候执行SET done =1。

    通过fetch 把结果放到 o 中,然后调用存储过程ordertotal,将该订单的结果查出来,然后就存入到ordertotals表中。

    CALL processorders

    然后查询出来是:

    下一节触发器。

  • 相关阅读:
    指示函数
    Sql Server中的日期与时间函数
    http://www.jb51.net/softjc/33896.html(vs2010破解)
    什么是VC维?
    smalldatetime和datetime的差别
    基于大规模语料的新词发现算法
    向setInterval , setTimeout调用的函数传递参数
    取指定月份的天数
    SQL 写循环数据
    JavaScript事件一瞥
  • 原文地址:https://www.cnblogs.com/aoximin/p/15363855.html
Copyright © 2011-2022 走看看