游标
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 的游标功能为逐行处理数据提供了基础支持,核心在于严格遵循声明顺序、使用处理器控制循环退出,以及结合循环语句完成业务逻辑。
热门帖子
- 12025-12-01浏览数:182759
- 22023-05-09浏览数:25044
- 42023-09-25浏览数:18519
- 52020-05-11浏览数:17526