查看“MySQL 语句:复合语句”的源代码
←
MySQL 语句:复合语句
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:MySQL]] == 关于 == == BEGIN ... END 复合语句 == == 语句标签 == == DECLARE 语句 == == 存储程序中的变量 == == 流控制语句 == == Cursors == MySQL 支持存储程序内部的游标。语法与嵌入式 SQL 中的语法相同。游标具有以下属性: # 不敏感:服务器可能会或可能不会复制其结果表 # 只读:不可更新 # 不可滚动:只能在一个方向上遍历,不能跳过行 游标声明必须出现在处理程序声明之前,变量和条件声明之后。<br/> 示例: <syntaxhighlight lang="mysql"> 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; </syntaxhighlight> === 游标 CLOSE 语句 === <syntaxhighlight lang="mysql"> CLOSE cursor_name </syntaxhighlight> 该语句关闭先前打开的游标。 * 如果未打开游标,则会发生错误。 * 如果未显式关闭游标,则在声明游标的“BEGIN ... END”块的末尾关闭游标。 === 游标 DECLARE 语句 === <syntaxhighlight lang="mysql"> DECLARE cursor_name CURSOR FOR select_statement </syntaxhighlight> 该语句声明一个游标,并将其与 SELECT 语句相关联,该语句检索该游标要遍历的行。要在以后获取行,请使用“'''FETCH'''”语句。 SELECT 语句检索的列数必须与 FETCH 语句中指定的输出变量数匹配。 * SELECT 语句不能包含 INTO 子句。 * 游标声明必须出现在处理程序声明之前,变量和条件声明之后。 * 存储的程序可能包含多个游标声明,但是在给定块中声明的每个游标必须具有唯一的名称。 对于通过 SHOW 语句可获得的信息,在许多情况下,可以通过将游标与“INFORMATION_SCHEMA”一起使用来获取等效信息。 === 游标 FETCH 语句 === <syntaxhighlight lang="mysql"> FETCH [[NEXT] FROM] cursor_name INTO var_name [, var_name] ... </syntaxhighlight> 该语句'''获取与指定游标(必须打开)关联的 SELECT 语句的下一行''',并前进游标指针。如果存在一行,则将提取的列存储在命名变量中。 SELECT 语句检索的列数必须与 FETCH 语句中指定的输出变量数匹配。 * 如果没有更多行可用,则使用 SQLSTATE 值'02000'发生 No Data 条件。要检测此条件,可以为其设置处理程序(或“NOT FOUND”条件)。 * 请注意,另一个操作,例如 SELECT 或另一个 FETCH,也可能通过引发相同条件来使处理程序执行。如果有必要区分哪个操作引发了这种情况,请将该操作放在其自己的“BEGIN ... END”块中,以便可以将其与自己的处理程序关联。 === 游标 OPEN 语句 === <syntaxhighlight lang="mysql"> OPEN cursor_name </syntaxhighlight> 该语句打开一个先前声明的游标。 === 服务器端游标的限制 === 服务器端游标是使用“'''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”语句。 == 条件处理 ==
返回至“
MySQL 语句:复合语句
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息