这里主要介绍游标 与 几种循环方法的使用,循环包括WHILE 和 FOR作为判断循环的条件,循环体都是使用LOOP…..END LOOP。作为退出循环的条件还有一个就是 EXIT WHEN 条件,具体看下面的例子:
一:使用EXIT WHEN 条件 退出循环
DECLARE
CURSOR C_EMP IS SELECT EMPID,EMPNAME,EMPTELEP FROM T_EMP;
P_EMPID T_EMP.EMPID%TYPE;
P_EMPNAME T_EMP.EMPNAME%TYPE;
P_EMPTELEP T_EMP.EMPTELEP%TYPE;
BEGIN
OPEN C_EMP;
LOOP
FETCH C_EMP INTO P_EMPNAME,P_EMPID,P_EMPTELEP ;
IF C_EMP%FOUND THEN
dbms_output.put_line('员工id 是' || P_EMPID || ',员工姓名是' || P_EMPNAME || ',员工电话是' || P_EMPTELEP);
END IF;
EXIT WHEN C_EMP%NOTFOUND;--使用EXIT WHEN 条件,退出循环
END LOOP;
CLOSE C_EMP;
END;
二.使用WHILE 作为循环条件
--使用while退出循环
DECLARE
CURSOR C_EMP IS SELECT EMPID,EMPNAME,EMPTELEP FROM T_EMP;
P_EMPID T_EMP.EMPID%TYPE;
P_EMPNAME T_EMP.EMPNAME%TYPE;
P_EMPTELEP T_EMP.EMPTELEP%TYPE;
BEGIN
OPEN C_EMP;
--打开游标后,先要取出来,判断是否有值,再进行循环
FETCH C_EMP INTO P_EMPNAME,P_EMPID,P_EMPTELEP ;
WHILE C_EMP%FOUND
LOOP
dbms_output.put_line('员工id 是' || P_EMPID || ',员工姓名是' || P_EMPNAME || ',员工电话是' || P_EMPTELEP);
--第二次取值,是在遍历中 取出游标,并移动到下一行
FETCH C_EMP INTO P_EMPNAME,P_EMPID,P_EMPTELEP ;
END LOOP;
CLOSE C_EMP;
END;
三 .使用FOR作为循环条件
注意:从ORACLE 10以后,使用FOR循环,不用 OPEN游标,FETCH游标 和 CLOSE游标,
declare
CURSOR C_EMP(P_ID T_EMP.ID%TYPE) IS SELECT EMPID,EMPNAME,EMPTELEP FROM T_EMP WHERE ID = P_ID;
P_EMP C_EMP%ROWTYPE;
begin
FOR P_EMP IN C_EMP(111)
LOOP
DBMS_OUTPUT.put_line('员工的编号是' || P_EMP.EMPID || ',员工的姓名是' || P_EMP.EMPNAME || ',员工的电话是' || P_EMP.EMPTELEP);
END LOOP;
end;
但是,从这个例子中,我觉的,FOR 似乎隐性地替你完成了打开游标和取出游标,在写FOR循环条件的时候,需要将行对象作为 循环的判定条件,而不是行中的某一个字段,比如你写成:
FOR P_EMP.ID IN 111..113
这样是取不出来值的。因为它并没有完成取出游标的隐性操作
这时,我在想,有些事情是不能深追究的,可能根本就走不通,就这样吧!