Oracle遍历游标的几种方式

1.for循环

会自动open和close游标, 自动定义了一个记录类型及声明该类型的变量,并自动fetch数据到这个变量中。
我们需要注意 Emp_record这个变量无需声明,无需指定数据类型, 具体的结构是由游标决定的。 这个变量的作用域仅仅是在循环体内。
SET SERVEROUTPUT ON 
DECLARE
     CURSOR emp_cursor  IS  SELECT  empno, ename  FROM  emp;  
BEGIN 
     FOR  Emp_record  IN emp_cursor  LOOP     
          DBMS_OUTPUT.PUT_LINE(Emp_record.empno|| Emp_record.ename);  
     END  LOOP;  
END;
 
--该种形式更为简单,省略了游标的定义,游标的SELECT查询语句在循环中直接出现
SET SERVEROUTPUT ON  
DECLARE  
  CURSOR emp_cursor IS    
  SELECT empno, ename FROM emp;   
BEGIN  
  FOR Emp_record IN emp_cursor LOOP      
      DBMS_OUTPUT.PUT_LINE(Emp_record.empno|| Emp_record.ename);   
   END  LOOP;  
END;  
 
2.while循环
 
DECLARE 
 --  声明游标 
 CURSOR mycur IS SELECT * FROM emp ;   -- List (EmpPo) 
 empInfo emp%ROWTYPE ; 
BEGIN 
 --  游标操作使用循环,但是在操作之前必须先将游标打开 
 OPEN mycur ; 
 --  使游标向下一行 
 FETCH mycur INTO empInfo ; 
 --  判断此行是否有数据被发现 
      WHILE (mycur%FOUNDLOOP 
                  DBMS_OUTPUT.put_line('雇员编号:'||empInfo.empno) ; 
                  DBMS_OUTPUT.put_line('雇员姓名:'||empInfo.ename) ; 
                      -- 修改游标,继续向下 
                  FETCH mycur INTO empInfo ; 
        END LOOP ; 
        close mycur ; 
END ; 
 
3.loop循环
 
DECLARE 
  V_ename VARCHAR2(10);  
  CURSOR emp_cursor IS   
  SELECT ename FROM emp;  
BEGIN 
 OPEN emp_cursor;  
 IF emp_cursor%ISOPEN THEN 
LOOP  
   FETCH emp_cursor INTO v_ename;  
   EXIT WHEN emp_cursor%NOTFOUND;  
   DBMS_OUTPUT.PUT_LINE(to_char(emp_cursor%ROWCOUNT)||'-'||v_ename);  
  END LOOP;  
 ELSE 
  DBMS_OUTPUT.PUT_LINE('用户信息:游标没有打开!');  
 END IF;  
 CLOSE  emp_cursor;  
END;  
 

猜你喜欢

转载自tommy-lu.iteye.com/blog/2299207
今日推荐