MySQL 5.0 游标基础

如果使用 PHP 的 fopen() 函数打开文件或操作数据数组,就会使用指针来完成任务。在前一种情况下,文件指针用于指示中的当前位置,而在后一咱情况下,指针用来遍历并可能操作各个数组值。
大多数数据库都提供一个类似的特性来迭代处理结果集。该牧场生称为游标(cursor),它允许你单独地获取集合中的每条记录,在该记录上完成执行多种操作时,不用担心影响集合中的其它记录。如下案例:
|| 如果工资 > 60000,佣金比率 > 5%,则奖金 = 工资 x 佣金比率
|| 如果工资 > 60000,佣金比率 <= 5%,则奖金 = 工资 x 3%
|| 所有其它员工,奖金 = 工资 x 7%

Oracle,mysql sql server 等数据库一直就支持游标;MySQL 5.0 也开始支持。

游标的使命周期必须按如下顺序进行:
1.使用 declare 语句声明
2.使用 open 语句打开
3.使用 fetch 语句从游标中获得数据
4.使用 close 语句关闭

mysql 游标还有它的一些特性:
1.服务器端
有些数据库服务器可以同时运行服务器端和客户端游标。服务器游标在数据库中管理,而客户端游标可以在数据库之外的应用程序(程序语言等)中生成,控制。 MySQL 只支持服务器端游标,也就是说,所有的游标必须和存储过程一样,事先写在数据库中,在各语言中只能进行请求调用

2.只读
游标可以是可读和可写的。只读游标可以从数据库中读取数据,而可写游标可以更新由游标指向的数据。MySQL 只支持只读游标,也就是说, 只能进行数据查询

3.敏感
游标可以是敏感的,也可以是不敏感的。敏感游标引用数据库中的实际数据,而不敏感的游标指向在创建游标时建立的数据临时副本。MySQL 只支持敏感游标, 因为是只读的,所以不用考虑破坏数据,因此直接对数据进行操作也没问题

4。只向前
高级的游标实现可以向后和向前遍历数据集,跳过记录,完成大量其它的导航任务。目前 MySQL 游标只是向前的,意味着 只能向前遍历数据集。此外,MySQL 游标一次只能向前移动一条记录,不能跳过

==================================================================================================

游标使用的整个过程:
1.创建游标
DECLARE calc_bonus CURSOR FOR SELECT id, salary, commission FROM employees;

2.打开游标
OPEN calc_bonus;

3.使用游标
FETCH calc_bonus INTO re_id, re_salary, re_comm;

4.关闭游标
CLOSE calc_bonus;

==================================================================================================
以前面提到的计算奖金为实例,给出一个存储过程,在其中使用游标:
DELIMITER //
CREATE PROCEDURE calculate_bonus()
BEGIN
      DECLARE emp_id INT;
      DECLARE sal DECIMAL(8, 2);
      DECLARE comm DECIMAL(3, 2);
      DECLARE done INT;

      DECLARE calc_bonus CURSOR FOR SELECT id, salary, commission FROM employees;
      DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
      OPEN calc_bonus;
      BEGIN_calc: LOOP
            FETCH calc_bonus INTO emp_id, sal, comm;
            IF done THEN
                  LEAVE begin_calc;
            IF sal > 60000 THEN
                  IF comm > 0.05 THEM
                        UPDATE employees SET bonus = sal * comm WHERE id = emp_id;
                  ELSEIF comm <= 0.05 THEN
                        UPDATE employees SET bonus = sal * 0.03 WHERE id = emp_id;
                  END IF;
            ELSE
                  UPDATE employees SET bonus = sal * 0.07 WHERE id = emp_id;
            END IF;
      END LOOP begin_calc;
      CLOSE calc_bonus;
END//
DELIMITER ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值