GBase 8a
其他
文章

游标

发表于2025-12-24 14:38:2038次浏览1个评论

GBase 8a 数据库支持游标(CURSOR)功能,主要用于在存储过程中对查询结果集进行逐行处理。以下是核心要点和示例:

一、游标的核心特性

• 类型:只读、单向(只能向前遍历,不可回滚)

• 作用域:仅在存储过程或函数中使用

• 声明顺序:游标必须在声明处理器(HANDLER)之前声明,变量和条件需在游标或处理器之前声明

二、使用游标的四个步骤

1.  声明游标  
   使用 DECLARE cursor_name CURSOR FOR select_statement 定义游标及其结果集 。  
   示例:  
   DECLARE cur CURSOR FOR SELECT salary FROM employees WHERE department = dept_name;
   

2.  打开游标  
   使用 OPEN cursor_name 打开游标,准备读取数据 。  
   示例:  
   OPEN cur;
   

3.  读取数据  
   使用 FETCH cursor_name INTO variables 逐行提取数据到变量中 。  
   示例:  
   FETCH cur INTO v_salary;
   

4.  关闭游标  
   使用 CLOSE cursor_name 释放游标资源 。  
   示例:  
   CLOSE cur;
   

三、游标遍历的循环控制

遍历游标时需配合循环语句(如 LOOP、REPEAT、WHILE)和异常处理器判断是否结束。GBase 8a 通过处理器捕获 NOT FOUND 状态(对应 SQLSTATE '02000')来退出循环 。  

示例处理器声明:  
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;  -- 或 FOR SQLSTATE '02000'


四、完整示例:计算部门平均工资

以下存储过程使用游标遍历某部门员工工资,并计算平均工资 :  
CREATE PROCEDURE calculate_average_salary(
   IN dept_name VARCHAR(255), 
   OUT avg_salary DECIMAL(10, 2)
)
BEGIN
   DECLARE v_salary DECIMAL(10, 2) DEFAULT 0;
   DECLARE total_salary DECIMAL(10, 2) DEFAULT 0;
   DECLARE emp_count INT DEFAULT 0;
   DECLARE done INT DEFAULT 0;

   -- 1. 声明游标
   DECLARE cur CURSOR FOR 
       SELECT salary FROM employees WHERE department = dept_name;

   -- 2. 声明处理器
   DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;

   -- 3. 打开游标
   OPEN cur;

   -- 4. 循环读取数据
   read_loop: LOOP
       FETCH cur INTO v_salary;
       IF done = 1 THEN 
           LEAVE read_loop;  -- 退出循环
       END IF;
       SET total_salary = total_salary + v_salary;
       SET emp_count = emp_count + 1;
   END LOOP;

   -- 5. 关闭游标
   CLOSE cur;

   -- 6. 计算结果
   IF emp_count > 0 THEN
       SET avg_salary = total_salary / emp_count;
   ELSE
       SET avg_salary = 0;
   END IF;
END;


五、关键注意事项

• 顺序限制:游标声明需在变量和处理器之前,否则会报错 。

• 退出条件:必须通过处理器设置标志位(如 done=1)判断游标是否遍历完毕,直接使用 FETCH 可能进入死循环 。

• 错误处理:可通过 DECLARE HANDLER FOR SQLEXCEPTION 捕获执行异常,并结合 GET DIAGNOSTICS 获取详细错误信息 。

六、总结

GBase 8a 的游标功能为逐行处理数据提供了基础支持,核心在于严格遵循声明顺序、使用处理器控制循环退出,以及结合循环语句完成业务逻辑。

评论

登录后才可以发表评论
用户头像
levvel发表于 4个月前
少年易学老难成,一寸光阴不可轻