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);
FOR Emp_record IN emp_cursor LOOP
DBMS_OUTPUT.PUT_LINE(Emp_record.empno|| Emp_record.ename);
END
LOOP;
END;
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;
END;
2.while循环
DECLARE
-- 声明游标
CURSOR mycur IS SELECT * FROM emp ; -- List (EmpPo)
empInfo emp%ROWTYPE ;
BEGIN
-- 游标操作使用循环,但是在操作之前必须先将游标打开
OPEN mycur ;
-- 使游标向下一行
FETCH mycur INTO empInfo ;
-- 判断此行是否有数据被发现
WHILE (mycur%FOUND) LOOP
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;