游标
复制代码
1
2
3
4
5
6
7
8有时,需要在检索出来的行中前进或后退一行或多行 游标是一个存储在MySQL服务器上的数据库查询 是被SELECT检索出来的结果集 存储了游标后, 应用可根据需要滚动或浏览其中的数据 MySQL游标只能用于存储过程[和函数]
使用游标
复制代码
1
2
3
4
5
6
7
8- 在能使用游标前,需先声明它 只是定义要使用的SELECT语句 - 一旦声明后, 必须打开游标以供使用 过程用前面定义的SELECT语句把数据实际检索出来 - 对填有数据的游标,需取出[检索]各行 - 结束游标使用时,需关闭游标
创建游标
复制代码
1
2
3
4
5
6
7
8
9
10
11DECLARE CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; END; DECLARE用来定义和命名游标 存储过程处理完后,游标消失
打开和关闭游标
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20OPEN ordernumbers; CLOSE ordernumbers;// 释放游标使用的所有内部内存和资源 一个游标关闭后,需重新打开 如不明确关闭游标,MySQL将会在到达END时自动关闭它 CREATE PROCEDURE processorders() BEGIN DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; OPEN ordernumbers; CLOSE ordernumbers; END; 存储过程, 声明 打开 关闭 一个游标
使用游标数据
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77一个游标被打开后, 可使用FETCH语句分别访问它的每一行 FETCH指定检索什么数据 检索出的数据存储在什么地方 还向前移动游标中的内部行指针,使下一条FETCH语句检索下一行[不重读读取同一行] - 从游标中检索单个行 CREATE PROCEDURE processorders() BEGIN DECLARE o INT; DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; OPEN ordernumbers; FETCH ordernumbers INTO o; CLOSE ordernumbers; END; FETCH用来检索当前行的order_num列到一个名为o的局部声明的变量 - 循环检索数据,从第一行到最后一行 CREATE PROCEDURE processorders() BEGIN DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; OPEN ordernumbers; REPEAT FETCH ordernumbers INTO o; UNTIL done END REPEAT; CLOSE ordernumbers; END; 反复执行FETCH,直到done为1 SQLSTATE '02000'是一个未找到条件 当REPEAT由于没有更多的行供循环而不能继续时, 出现此条件 DECLARE语句次序 DECLARE语句的发布存在特定的次序 用DECLARE语句定义的局部变量必须在定义任意游标或句柄前定义 句柄必须在游标后定义 局部变量 游标 句柄 CREATE PROCEDURE processorders() BEGIN DECLARE done BOOLEAN DEFAULT 0; DECLARE o INT; DECLARE t DECIMAL(8, 2); DECLARE ordernumbers CURSOR FOR SELECT order_num FROM orders; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done = 1; CREATE TABLE IF NOT EXISTS ordertotals (order_num INT, total DECIMAL(8, 2)); OPEN ordernumbers; REPEAT FETCH ordernumbers INTO o; CALL ordertotal(o, 1, t);// 另一个存储过程 INSERT INTO ordertotals(order_num, total) VALUES(o, t); UNTIL done END REPEAT; CLOSE ordernumbers; END; SELECT * FROM ordertotals;
最后
以上就是糊涂大船最近收集整理的关于1-7:使用游标的全部内容,更多相关1-7内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复