MySQL学习笔记8(使用游标,控制事务管理)

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)

猜你喜欢

转载自blog.csdn.net/captainNYS/article/details/88051025