24使用游标
1游标
游标(cursor)是一个存储在MySQL服务器上的数据库查询,它不是一条SELECT语句,而是被该语句检索出来的的结果集。在存储了游标之后,应用程序可以根据需要滚动或浏览其中的数据。(有点难懂,先跳过去往下看)
游标只能用于存储过程(和函数)。
2使用游标
- 使用游标前必须声明。
- 一旦声明必须打开游标以供使用。
- 对于填有数据的游标,根据需要取出(检索)各行。
- 在结束游标使用时,必须关闭游标。
2.1创建游标
CREATE PROCEDURE processorders()
BEGIN
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM orders;
END;
DECLARE语句用来定义和命名游标,这里为ordernumbers。存储过程结束后,游标就消失(因为它局限于存储过程)。定义游标之后,可以打开。
2.2打开和关闭游标
OPEN ordernumbers;
打开游标之后就可以使用游标数据(具体例子见2.3),游标处理完成后应当关闭:
CLOSE ordernumbers;
2.3使用游标数据
在一个游标打开后,可以使用FETCH语句分别访问它的每一行。
第一个例子从游标中检索单个行(第一行):
--DELIMITER//
CREAT 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的局部变量中。对检索出的数据不做任何处理。
第二个例子循环检索数据,从第一行到最后一行:
CREAT PROCEDURE processorders()
BEGIN
DECLARE done BOOLEAN DEFAULT 0;
DECLARE o INT;
DECLARE ordernumbers CURSOR
FOR SELECT order_num FROM orders;
DECLARE CONTINUE HANDLER FOR SQL STATE ‘02000’ SET done=1;
OPEN ordernumbers;
REPEAT
FETCH ordernumbers INTO o;
UNTIL done END REPEAT;
CLOSE ordernumbers;
END//
与上例不同的是,这个FETCH在REPEAT中,因此它反复执行直到done为真(由 UNTIL done END REPEAT;规定)。为使它起作用,用一个DEFAULT 0 定义变量done。那么done何时为真?关键在这条语句:
DECLARE CONTINUE HANDLER FOR SQL STATE ‘02000’ SET done=1;
定义了一个CONTINUE HANDLER,它是在条件出现时被执行。指出当出现SQL STATE ‘02000’时,SET done=1。SQL STATE ‘02000’是一个未找到条件,当REPEAT没有更多的行往下循环时,出现这个条件。
25管理事务处理(来自菜鸟教程)
事务处理可以用来维护数据库的完整性,它保证成批的MySQL操作要么完全执行,要么完全不执行。
事务(transaction)指一组SQL语句
回退(rollback)指撤销指定SQL语句的过程
提交(commit)指将未存储的SQL语句结果写入数据库表
保留点(savepoint)指事务处理中设置的临时占位符,可以对他发布回退
事务控制语句:
-
BEGIN或START TRANSACTION;显式地开启一个事务;
-
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;
-
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
-
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
-
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
-
ROLLBACK TO identifier;把事务回滚到标记点;
-
SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务
- ROLLBACK 事务回滚
- COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0 禁止自动提交
- SET AUTOCOMMIT=1 开启自动提交
mysql> use RUNOOB;
Database changed
mysql> CREATE TABLE runoob_transaction_test( id int(5)) engine=innodb; # 创建数据表
Query OK, 0 rows affected (0.04 sec)
mysql> select * from runoob_transaction_test;
Empty set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test value(5);
Query OK, 1 rows affected (0.01 sec)
mysql> insert into runoob_transaction_test value(6);
Query OK, 1 rows affected (0.00 sec)
mysql> commit; # 提交事务
Query OK, 0 rows affected (0.01 sec)
mysql> select * from runoob_transaction_test;
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)
mysql> begin; # 开始事务
Query OK, 0 rows affected (0.00 sec)
mysql> insert into runoob_transaction_test values(7);
Query OK, 1 rows affected (0.00 sec)
mysql> rollback; # 回滚
Query OK, 0 rows affected (0.00 sec)
mysql> select * from runoob_transaction_test; # 因为回滚所以数据没有插入
+------+
| id |
+------+
| 5 |
| 6 |
+------+
2 rows in set (0.01 sec)