MySQL 语句:复合语句

来自Wikioe
跳到导航 跳到搜索


关于

BEGIN ... END 复合语句

语句标签

DECLARE 语句

存储程序中的变量

流控制语句

Cursors

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

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


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

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 值'02000'发生 No Data 条件。要检测此条件,可以为其设置处理程序(或“NOT FOUND”条件)。
  • 请注意,另一个操作,例如 SELECT 或另一个 FETCH,也可能通过引发相同条件来使处理程序执行。如果有必要区分哪个操作引发了这种情况,请将该操作放在其自己的“BEGIN ... END”块中,以便可以将其与自己的处理程序关联。

游标 OPEN 语句

OPEN cursor_name

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

服务器端游标的限制

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


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

  • 游标是只读的;您不能使用游标更新行。
  • “UPDATE WHERE CURRENT OF”和“DELETE WHERE CURRENT OF”不会被执行,因为不支持可更新游标。
  • 游标是不可保留的(在提交后不会保持打开状态)。
  • 游标不敏感。【?】
  • 游标是不可滚动的。【?】
  • 游标是不能被命名的。语句处理程序充当游标 ID。【?】
  • 每个准备好的语句只能打开一个游标。如果需要多个游标,则必须准备多个语句。
  • 如果在准备模式下不支持该语句,则不能将游标用于生成结果集的语句。这包括诸如“CHECK TABLE”,“HANDLER READ”和“SHOW BINLOG EVENTS”语句。

条件处理