显式游标的基本使用
游标分两大类:静态游标、动态游标(REF游标)
静态游标分两类:显示游标、隐式游标
1、显示游标的使用
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --声明游标
emp_var EMP%ROWTYPE; --声明变量:变量emp_var是表EMP的行类型
BEGIN
OPEN emp_cur; --打开游标
FETCH emp_cur INTO emp_var; --获取游标数据
DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);
--输出数据
CLOSE emp_cur; --关闭数据
END;
结果:
7369-SMITH-CLERK-7902
2、游标中的LOOP语句
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --声明游标
emp_var EMP%ROWTYPE; --声明变量:变量emp_var是表EMP的行类型
BEGIN
OPEN emp_cur; --打开游标
LOOP
FETCH emp_cur INTO emp_var; --获取游标数据
EXIT WHEN emp_cur%NOTFOUND; --结束循环
DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);
--输出数据
END LOOP;
CLOSE emp_cur; --关闭数据
END;
结果:
7369-SMITH-CLERK-7902
7499-ALLEN-SALESMAN-7698
7521-WARD-SALESMAN-7698
7566-JONES-MANAGER-7839
7654-MARTIN-SALESMAN-7698
7698-BLAKE-MANAGER-7839
7782-CLARK-MANAGER-7839
7788-SCOTT-ANALYST-7566
7839-KING-PRESIDENT-
7844-TURNER-SALESMAN-7698
7876-ADAMS-CLERK-7788
7900-JAMES-CLERK-7698
7902-FORD-ANALYST-7566
7934-MILLER-CLERK-7782
3、使用FETCH…BULK COLLECT INTO批量提取数据
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --声明游标
TYPE EMP_TABLE IS TABLE OF EMP%ROWTYPE; --声明类型
emp_var EMP_TABLE; --变量:该变量用于存放批量得到的数据(看成集合)
BEGIN
OPEN emp_cur; --打开游标
LOOP
FETCH emp_cur BULK COLLECT INTO emp_var LIMIT 2; --获取游标数据(集合),每次提取2条
FOR i IN 1..emp_var.count LOOP
DBMS_OUTPUT.put_line(emp_var(i).EMPNO ||'-'|| emp_var(i).ENAME||'-'||emp_var(i).JOB||'-'||emp_var(i).MGR);
--输出数据
END LOOP;
EXIT WHEN emp_cur%NOTFOUND; --结束循环
END LOOP;
CLOSE emp_cur; --关闭数据
END;
结果:
7369-SMITH-CLERK-7902
7499-ALLEN-SALESMAN-7698
7521-WARD-SALESMAN-7698
7566-JONES-MANAGER-7839
7654-MARTIN-SALESMAN-7698
7698-BLAKE-MANAGER-7839
7782-CLARK-MANAGER-7839
7788-SCOTT-ANALYST-7566
7839-KING-PRESIDENT-
7844-TURNER-SALESMAN-7698
7876-ADAMS-CLERK-7788
7900-JAMES-CLERK-7698
7902-FORD-ANALYST-7566
7934-MILLER-CLERK-7782
4、CURSOR FOR LOOP简化循环
DECLARE
CURSOR emp_cur
IS SELECT * FROM EMP; --声明游标
BEGIN
FOR emp_var IN emp_cur
LOOP
DBMS_OUTPUT.put_line(emp_var.EMPNO ||'-'|| emp_var.ENAME||'-'||emp_var.JOB||'-'||emp_var.MGR);
--输出数据
END LOOP;
END;
![](https://i-blog.csdnimg.cn/blog_migrate/07df64cf5f8739d9e4ee18585da0bd9c.jpeg#pic_center)