学习目标:

1.理解游标

2.使用游标的步骤:

2.1 声明游标

2.2 打开游标

2.3 使用游标

2.4 关闭游标

学习导航:

画板

一、认识游标

1.who?(游标是什么?)

游标(cursor)官方定义:是系统为用户开通的一个数据缓冲区,存放sql执行结果。每个游标区都有一个名字,用户可以通过sql语句逐一从游标中获取记录,并赋值给变量,交由主语言进一步处理;
个人理解:感觉游标和指针相似,指定结果集后一行行执行;

2.why?(为什么要学习游标)
游标允许应用程序对查询语句select 返回的行结果集中每一行进行相同或不同的操作,而不是一次对整个结果集进行同一种操作;
它还提供对基于游标位置而对表中数据进行删除或更新的能力;
而且,正是游标把作为面向集合的数据库管理系统和面向行的程序设计两者联系起来,使两个数据处理方式能够进行沟通。

3.what?(游标的生命周期)
—1.声明游标 —2.打开游标 —3.声明游标提取数据所要存放的变量 —4.定位游标到哪一行

二、应用游标

  1. -- 创建存储过程,逐个访问用户信息
  2. -- 使用游标操作数据
  3. DROP PROCEDURE IF EXISTS proc_user;
  4. CREATE PROCEDURE proc_user()
  5. BEGIN
  6. -- 声明局部变量接受游标值
  7. -- 声明变量n,表示数据行数
  8. DECLARE n INT;
  9. DECLARE uname VARCHAR(20) DEFAULT '';
  10. DECLARE utel CHAR(11);
  11. -- 1. declare 声明游标,指针
  12. DECLARE cur_name CURSOR
  13. FOR SELECT customerName,tel FROM customer ;
  14. -- 添加赋值,n作为循环控制变量
  15. SELECT COUNT(*) INTO n from customer ;
  16. -- 2. OPEN 打开游标
  17. OPEN cur_name;
  18. -- 循环操作
  19. REPEAT
  20. -- 3. FETCH 读取游标数据赋值给变量
  21. FETCH cur_name INTO uname,utel;
  22. -- 4. 处理uname,tel
  23. SELECT uname,utel;
  24. -- 修改循环控制变量
  25. SET n = n-1;
  26. UNTIL n = 0
  27. END REPEAT;
  28. -- 5. CLOSE 关闭游标
  29. CLOSE cur_name;
  30. END;
  31. -- 调用存储过程
  32. CALL proc_user();

三、任务实施

— 定义存储过程

— 拼接购买了商品的客户信息

— 客户姓名电话地址

— 电话或地址如果为null或空串,就用未知替代

  1. -- 定义存储过程
  2. -- 拼接购买了商品的客户信息
  3. -- 客户姓名_电话_地址
  4. -- 电话或地址如果为null或空串,就用未知替代
  5. DROP PROCEDURE if EXISTS customer_info;
  6. --
  7. CREATE PROCEDURE customer_info()
  8. BEGIN
  9. -- todo
  10. DECLARE done int DEFAULT 0; -- 未停止
  11. DECLARE customerName,tel,address VARCHAR(50);
  12. -- 1. 声明游标
  13. DECLARE cur CURSOR FOR -- 有订单的客户信息
  14. SELECT c.customerName,c.tel,c.address FROM customer c
  15. WHERE customerID in
  16. (SELECT customerID from orders o);
  17. DECLARE CONTINUE HANDLER FOR not found SET done = 1; # 异常处理
  18. -- 2. 打开游标
  19. OPEN cur;
  20. while (done=0) do
  21. -- 3. 读取游标
  22. FETCH cur INTO customerName,tel,address;
  23. IF done=0 then
  24. -- 4. 处理数据
  25. if tel IS null OR tel = '' THEN
  26. SET tel = "未知";
  27. end if;
  28. if address is null OR address = '' THEN
  29. SET address = "未知";
  30. end if;
  31. SELECT CONCAT_WS('_',customerName,tel,address);
  32. end if;
  33. end while;
  34. -- 5. 关闭游标
  35. CLOSE cur;
  36. END;
  37. -- 调用
  38. CALL customer_info();