• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 游标语句

    MySQL支持存储程序内部的游标。语法与嵌入式SQL中的语法相同。游标具有以下属性:

    • 不敏感:服务器可能会或可能不会复制其结果表
    • 只读:不可更新
    • 不可滚动:只能在一个方向上遍历,不能跳过行

    游标声明必须出现在处理程序声明之前,变量和条件声明之后。

    例:

    CREATE PROCEDURE curdemo()
    BEGIN
      DECLARE done INT DEFAULT FALSE;
      DECLARE a CHAR(16);
      DECLARE b, c INT;
      DECLARE cur1 CURSOR FOR SELECT id,data FROM test.t1;
      DECLARE cur2 CURSOR FOR SELECT i FROM test.t2;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;
    
      OPEN cur1;
      OPEN cur2;
    
      read_loop: LOOP
        FETCH cur1 INTO a, b;
        FETCH cur2 INTO c;
        IF done THEN
          LEAVE read_loop;
        END IF;
        IF b < c THEN
          INSERT INTO test.t3 VALUES (a,b);
        ELSE
          INSERT INTO test.t3 VALUES (a,c);
        END IF;
      END LOOP;
    
      CLOSE cur1;
      CLOSE cur2;
    END;
    

    游标CLOSE语句

    CLOSE cursor_name
    

    该语句关闭先前打开的游标。

    如果光标未打开,则会发生错误。

    如果未显式关闭游标BEGIN ... END,则在声明游标的块末尾将其关闭。

    游标DECLARE语句

    DECLARE cursor_name CURSOR FOR select_statement
    

    该语句声明一个游标,并将其与一条SELECT语句相关联,该语句检索该游标要遍历的行。要在以后获取行,请使用一条FETCH语句。SELECT语句检索的列数必须与语句中指定的输出变量数匹配FETCH

    SELECT语句不能有INTO子句。

    游标声明必须出现在处理程序声明之前,变量和条件声明之后。

    存储的程序可能包含多个游标声明,但是在给定块中声明的每个游标都必须具有唯一的名称。

    对于通过SHOW语句可用的信息,在许多情况下,可以通过将游标与INFORMATION_SCHEMA表一起使用来获取等效信息。

    游标FETCH语句

    FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ...
    

    该语句获取SELECT与指定游标(必须是打开的)关联的语句的下一行,并前进游标指针。如果存在一行,则提取的列将存储在命名变量中。SELECT语句检索的列数必须与语句中指定的输出变量数匹配FETCH

    如果没有更多行可用,则使用SQLSTATE value发生No Data条件'02000'。要检测此条件,可以为其设置处理程序(或NOT FOUND条件)。

    请注意,另一个操作(例如a SELECT或another FETCH)也可能通过引发相同条件来使处理程序执行。如果有必要区分哪个操作引发了这种情况,请将该操作放在其自己的BEGIN ... END块中,以便可以将其与自己的处理程序关联。

    游标OPEN语句

    OPEN cursor_name
    

    该语句打开一个先前声明的游标。

    服务器端游标的限制

    使用该mysql_stmt_attr_set()函数在C API中实现服务器端游标。存储的例程中的游标使用相同的实现。服务器端游标使结果集可以在服务器端生成,但是除了客户端请求的那些行之外,不会传输到客户端。例如,如果客户端执行查询但仅对第一行感兴趣,则不传输其余行。

    在MySQL中,服务器端游标被实现为内部临时表。最初,这是一个MEMORY表,但是MyISAM当其大小超过max_heap_table_sizetmp_table_size系统变量的最小值时,将转换为表。对于内部临时表和内部临时表的其他用途,这些限制也适用于为保存游标的结果集而创建的内部临时表。请参见“ MySQL中的内部临时表使用”。该实现的局限性在于,对于较大的结果集,通过游标检索其行可能很慢。

    游标是只读的;您不能使用游标更新行。

    UPDATE WHERE CURRENT OF并且DELETE WHERE CURRENT OF未实现,因为不支持可更新的游标。

    游标是不可保留的(在提交后不会保持打开状态)。

    游标不敏感。

    游标是不可滚动的。

    游标未命名。语句处理程序充当游标ID。

    每个准备好的语句只能打开一个游标。如果需要多个游标,则必须准备多个语句。

    如果在准备模式下不支持该语句,则不能将游标用于生成结果集的语句。这包括语句,如CHECK TABLEHANDLER READSHOW BINLOG EVENTS