MySQL游标

来源:互联网 发布:淘宝柒牌官方旗舰店 编辑:程序博客网 时间:2024/05/16 14:46

MySQL中的游标仅在存储过程中被支持,只读且不可滚动,使用光标可以迭代每一行结果,并把结果提取到变量中以做进一步处理。

游标是在临时表上进行操作的,其语法如下所示:

 

DECLARE cursor_name CURSOR FOR select_statement

这个语句声明一个光标。也可以在子程序中定义多个光标,但是一个块中的每一个光标必须有唯一的名字。

SELECT语句不能有INTO子句。

 

OPEN cursor_name

这个语句打开先前声明的光标。

 

FETCH cursor_name INTO var_name [, var_name] ...

这个语句用指定的打开光标读取下一行(如果有下一行的话),并且前进光标指针。

 

CLOSE cursor_name

这个语句关闭先前打开的光标。

如果未被明确地关闭,光标在它被声明的复合语句的末尾被关闭。 

 

例如:

CREATE PROCEDURE curdemo()

 

BEGIN

 

  DECLARE done INT DEFAULT 0;

 

  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 SQLSTATE '02000' SET done = 1;

 

 

 

  OPEN cur1;

 

  OPEN cur2;

 

 

 

  REPEAT

 

    FETCH cur1 INTO a, b;

 

    FETCH cur2 INTO c;

 

    IF NOT done THEN

 

       IF b < c THEN

 

          INSERT INTO test.t3 VALUES (a,b);

 

       ELSE

 

          INSERT INTO test.t3 VALUES (a,c);

 

       END IF;

 

    END IF;

 

  UNTIL done END REPEAT;

 

 

 

  CLOSE cur1;

 

  CLOSE cur2;

 

END

 

 

 

在MySQL中,不管是提前关闭游标,还是读完后关闭,其代价是一样的,都需要执行完SQL语句的代价;

此外,游标会导致额外的I/O开销,例如临时表大于tmp_table_size时,将会在磁盘上为游标创建临时表。

 

原创粉丝点击