温馨提示:在 ChatGPT 官网(www.chatgpt.com)使用 GPT-5.5、ChatGPT-Image-2 等模型时,需要 ChatGPT Plus 或更高等级的会员权限。如需购买账号或充值会员,请扫码添加我们客服咨询。
DB2中的CURSOR(游标)就像一个“数据指针”,能让你逐行处理查询结果,配合WHILE循环,你可以像翻书一样,一次拿一行数据,处理完再拿下一行,直到全部读完。,具体步骤是:先定义游标指向你的查询结果,然后打开游标,接着用WHILE循环不停地用FETCH语句取出当前行数据,存到你定义的变量里,再执行你需要的操作(比如计算、拼接输出),每取完一行,游标会自动移动到下一行,当FETCH取不到数据时,循环结束,最后别忘了关闭并释放游标。,这样就能一步步精确控制每条数据,灵活输出你想要的内容,非常适合复杂的分步处理。
本文目录导读:
你好,欢迎来看这篇教程,如果你是第一次接触DB2数据库,或者第一次听说“Cursor”和“While”这两个词,别担心,这篇文章就是为你写的。
我们不用那些难懂的专业术语,我们就把数据库想象成一个装满文件的巨大文件柜,你平时查询数据,就像一次把整个抽屉的文件都搬出来看,但有时候,你不需要所有文件,只想一个一个地看,或者对每个文件做点不同的操作。
这时候,Cursor(游标)和While(循环)就派上用场了,它们就像你的一只手,可以帮你从文件柜里一次只抽出一个文件,处理完,再拿下一个,这样,你就可以对每一行数据做细致的工作。
第一部分:什么是Cursor(游标)?
简单说,Cursor就是一个指向数据库查询结果中“某一行数据”的指针,你的查询结果可能有很多行,所有名叫张三的客户”,Cursor就像一根手指,先指向第一行数据,然后你告诉它“下一个”,它就指向第二行,再下一个,指向第三行……直到全部指完。
为什么需要它?
平时我们用SQL语句,SELECT * FROM TABLE,结果一下子全出来了,你没法对每一行单独做不一样的事情,你想根据每个客户的消费金额,给他们发放不同的优惠券,用普通SQL就很难办到,但有了Cursor,你就可以:
- 指向第一个客户。
- 看看他消费了多少钱。
- 根据金额,决定给他发5块还是50块的优惠券。
- 然后指向下一个客户。
- 重复上面的步骤。
这就是Cursor最核心的作用:让你能一行一行地处理数据。
第二部分:什么是While(循环)?
While是一个控制指令,它的意思很简单:“只要条件成立,就一直做下面的事情”。“只要碗里还有饭,就一直吃”。
Cursor很需要一个帮手来告诉它“什么时候该指向下一行,什么时候该停下来”,这个帮手就是While。
它们俩怎么配合?
通常是这样工作的:
- 打开Cursor:我们先准备好要处理的“文件队列”(也就是你的查询结果)。
- 开始While循环:我们告诉电脑:“只要还有下一行数据,就继续干”。
- 提取下一行:在循环里,我们让Cursor指向下一行数据,并把这一行的数据取出来,存到几个变量里(比如
v_name,v_amount)。 - 处理数据:我们就可以用刚才取出来的
v_name和v_amount做任何事情了,比如计算、更新另一张表,或者打印出来。 - 结束循环:当Cursor指向最后一行,再让它指“下一个”时,它会告诉你“没了”,这时候,While循环的条件不成立了,循环就自动结束。
- 关闭Cursor:我们把Cursor关掉,告诉电脑我们干完了。
第三部分:一个完整的例子(一步一步来)
假设我们有一张员工表 EMPLOYEES,里面有两个字段:EMP_ID(员工号)和SALARY(工资)。
老板说:“想给每个人涨工资,如果工资低于5000,涨1000;如果高于5000,涨500。”
我们来看看用Cursor和While怎么做。
第一步:写一个存储过程(Procedure)
DB2里,我们通常在存储过程里用Cursor,你可以把存储过程想象成一个“小工具”,你把要做的步骤写进去,以后直接叫它的名字就能运行。
-- 创建存储过程的名字
CREATE PROCEDURE RAISE_SALARY_PROC()
LANGUAGE SQL
BEGIN
-- 1. 声明变量:用来临时存放每一行数据
DECLARE v_emp_id INT;
DECLARE v_salary DECIMAL(10,2);
-- 2. 声明一个“结束标志”,用来控制循环
DECLARE done INT DEFAULT 0;
-- 3. 声明 Cursor:告诉电脑我要处理哪些数据
DECLARE emp_cursor CURSOR FOR
SELECT EMP_ID, SALARY FROM EMPLOYEES;
-- 4. 声明一个“异常处理”:当Cursor取不到数据时(即遍历完了),把标志置为1
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;
-- 5. 打开 Cursor,准备开始
OPEN emp_cursor;
-- 6. 开始 While 循环
WHILE done = 0 DO
-- 7. 从Cursor中取下一行数据,存到变量里
FETCH FROM emp_cursor INTO v_emp_id, v_salary;
-- 8. 如果取到了数据(done还是0),就进行处理
IF done = 0 THEN
-- 9. 判断工资,决定涨多少
IF v_salary < 5000 THEN
UPDATE EMPLOYEES
SET SALARY = SALARY + 1000
WHERE EMP_ID = v_emp_id;
ELSE
UPDATE EMPLOYEES
SET SALARY = SALARY + 500
WHERE EMP_ID = v_emp_id;
END IF;
END IF;
END WHILE;
-- 10. 关闭 Cursor
CLOSE emp_cursor;
END
我们来一句一句看,不要被吓到:
DECLARE v_emp_id INT;:我们准备了一个叫v_emp_id的盒子,用来放员工号。DECLARE done INT DEFAULT 0;:我们准备了一个叫done的开关,一开始是0(表示“还没干完”)。DECLARE emp_cursor CURSOR FOR ...:这就是我们定义的Cursor(文件指针),它指向了我们想处理的SELECT结果。DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = 1;:这是最关键的一步,它告诉电脑:“当Cursor再也取不到数据时(NOT FOUND),就把done这个开关设为1。”OPEN emp_cursor;:打开Cursor,准备工作。WHILE done = 0 DO:只要开关还是0(还没干完),就一直重复下面的步骤。FETCH FROM emp_cursor INTO ...:让Cursor指向下一行,并把这一行的员工号和工资拿出来,放进我们准备好的盒子里。IF done = 0 THEN:万一在FETCH这一步,Cursor没取到数据(比如表是空的),done就会变成1,所以我们要检查一下,如果没取到数据,就不处理。END WHILE;:循环结束,程序会跳回WHILE done = 0 DO这里,再次检查开关,如果这个员工处理完了,开关还是0,就继续取下一位员工。CLOSE emp_cursor;:所有员工都处理完了,关掉文件指针。
第四部分:给小白用户的几点建议
- 先试个简单的:别一上来就处理几百万条数据,你可以先写一个只返回10条记录的Cursor,运行看看,打印出一些信息,确认逻辑是对的,你可以在
IF done = 0 THEN里面加一句SELECT v_emp_id, v_salary;来显示你取到了什么。 - 别忘记“空格”和“分号”:SQL对空格要求不严,但分号很重要,上面的代码里,每个完整的语句结束都要有分号。
- 一定要记得“CLOSE”:打开Cursor就像打开了一扇门,你不关掉它,别人可能进不来,或者会浪费数据库资源。打开(OPEN)后,一定要记得关闭(CLOSE)。
- 理解“FETCH”:这是最关键的一步。
FETCH抓取”的意思,一次只抓一行,循环一次,抓一行,循环全靠它来“推进”,没有FETCH,循环就会停不下来,一直处理第一行数据。 - 小心死循环:如果你忘记写
DECLARE CONTINUE HANDLER ...或者忘记在循环里调用FETCH,那么done永远都是0,循环就会一直跑下去,直到数据库受不了,所以一定要确保循环有出口。
第五部分:总结一下
- Cursor:让你能一次看数据库结果中的一行数据。
- While:一个帮手,让你能重复做一件事,直到条件不成立。
- 它们俩合作:Cursor负责拿数据,While负责控制“拿下一个”的节奏,直到所有数据都处理完。
虽然这个例子看起来有点长,但请记住,它的核心逻辑非常简单:打开 -> 循环(取一行 -> 处理一行)-> 关闭,用熟了这个模式,你就能处理很多用普通SQL很难解决的问题了。
如果你在写DB2的存储过程或者使用Cursor时,遇到任何问题,比如想找人帮忙看看代码对不对,或者想知道更高级的用法,都可以随时来找我们。
温馨提示:在 ChatGPT 官网(www.chatgpt.com)使用 GPT-5.5、ChatGPT-Image-2 等模型时,需要 ChatGPT Plus 或更高等级的会员权限。如需购买账号或充值会员,请扫码添加我们客服咨询。


网友评论