MySQL学习之游标和事务处理(DECLARE)

一.游标

1.使用游标的原因:有时候我们需要在检索出来的行中前进或后退一行或多行。

2.游标(cursor)的定义:它是存储在MySQL服务器上的数据库查询,他不是SELECT语句,它是一个结果集,在MySQL中游标只能用于存储过程和函数。

3.使用游标
使用游标进行开发需要下面几个必要的步骤:

1)声明定义游标,在这个过程实际上没有检索数据,它只是定义要使用的SELECT语句
2)一旦声明后,必须打开游标以供使用,这个过程中用前面的定义的SELECT语句把数据检索出来。
3)对于填有数据的游标,根据需要取出各行。
4)结束游标的使用后,必须关闭游标。

创建游标:
游标用DECLARE语句创建,DECLARE命名游标,并定义相应的SELECT语句,根据需要带WHERE和其他子句,例如下面:

CREATE PROCEDURE processorders()
BEGIN
   DECLARE ordernumbers CURSOR
   FOR
   SELECT order_num FROM order;
END;

其中我们的
DECLARE ordernumbers CURSOR
FOR
SELECT order_num FROM order;
就是创建了一个游标。

打开和关闭游标:
打开:OPEN ordernumbers;
上面语句执行查询,存储检索出的数据以供浏览。

关闭:CLOSE ordernumbers;
CLOSE释放游标使用的所有内容和资源。

例子:

CREATE PROCEDURE processorders()
BEGIN
   DECLARE ordernumbers CURSOR
   FOR
   SELECT order_num FROM order;
   OPEN ordernumbers;
   CLOSE ordernumbers;
END;

注意:如果我们没有明确关闭游标,MySQL将会在END语句时自动关闭它。

使用游标数据:
打开游标后,我们可以使用FETCH语句分别访问它的每一行。
例如:

CREATE PROCEDURE processorders()
BEGIN
   DECLARE o INT;//创建局部变量o
   
   DECLARE ordernumbers CURSOR//创建游标
   FOR
   SELECT order_num FROM order;
   
   OPEN ordernumbers;//打开游标
   FETCH ordernumbers INTO o;//检索当前行的order_num列到一个名为o的变量中(从第一行开始)
   CLOSE ordernumbers;//关闭游标
END;

上面的只实现了检索一行,如果我们想要检索多行我们可以循环检索:

CREATE PROCEDURE processorder()
BEGIN
   DECLARE done BOOLEAN DEFAULT 0;//创建布尔变量done初始为0
   DECLARE o INT;//创建int型变量o

   DECLARE ordernumbers CURSOR//创建游标
   FOR
   SELECT order_num FROM orders;

/*
  这条语句定义了在条件出现时被执行的代码,当SQLSTATE '02000'出现时,SET done=1;
*/
   DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;

   OPEN ordernumbers;//打开游标
   
   //循环体执行当done为1时结束
   REPEAT
      FETCH ordernumbers INTO o;
   UNTIL done END REPEAT;
    
    CLOSE ordernumbers;//关闭游标
 END;

二.管理事务处理

使用事务处理通过确保成批的SQL操作要么完全执行,要么完全不执行,来维护数据库的完整性。

1.相关术语:
事务(transaction)指的是一组SQL语句。
回退(rollback) 指的是撤销指定SQL语句的过程。
提交(commit)指的是将未存储的SQL语句结果写入数据库表。
保留点(savepoint)指事务处理中设置的临时占位符可以对它发布回退。

注意:一般回退INSERT , UPDATE ,DELETE语句

2.控制事务处理

使用ROLLBACK:

DELETE FROM Orders;
ROLLBACK;

上面语句先删除了Orders表,然后回退,相当于什么都没做。

使用COMMIT:

START TRANSACTION;
DELETE FROM orderitems WHERE order_num=200010;
DELETE FROM orders WHERE order_num=200010;
COMMIT;

它保证了两个删除语句要么都执行,要么一个都不执行。

使用保留点:
简单的ROLLBACK和COMMIT语句就可以写入或撤销整个事务处理,但如果我们要实现部分提交或回退,我们就需要SAVEPOINT。

SAVEPOINT delete1;//创建保留点
.....
ROLLBACK TO delete1;//回退到保留点

学习总结自《MySQL必知必会》

猜你喜欢

转载自blog.csdn.net/c1776167012/article/details/108552088