1 游标类型
静态游标
CURSOR EMP_CURSOR IS
SELECT * FROM EMP;
动态游标
-- 定义动态游标类型
TYPE CURSORTYPE IS REF CURSOR;
-- 定义动态游标变量
V_CURSOR CURSORTYPE;
-- 1 打开游标并指向数据集
OPEN V_CURSOR FOR
SELECT * FROM EMP;
-- 2 循环 ...
系统游标
-- 定义系统变量[除了定义的变量类型不一样,其他和动态游标都一致]
V_CURSOR SYS_REFCURSOR;
游标属性
CURSOR_NAME%FOUND -- 有数据
CURSOR_NAME%NOTFOUND -- 无数据
CURSOR_NAME%ISOPEN -- 当前游标是否打开
CURSOR_NAME%ROWCOUNT -- 当前行号
2 循环方式
传统方式
DECLARE
-- 定义游标
CURSOR EMP_CURSOR IS
SELECT * FROM EMP;
-- 定义 游标行类型 变量
EMP_REC EMP_CURSOR % ROWTYPE;
BEGIN
-- 循环游标内容 [传统方式]
-- 1 打开游标
OPEN EMP_CURSOR;
-- 2 循环游标
LOOP
-- 3 取出游标当前指向的行数据
FETCH EMP_CURSOR
INTO EMP_REC;
-- 4 判断退出条件
EXIT WHEN EMP_CURSOR % NOTFOUND;
-- 5 数据操作
DBMS_OUTPUT.put_line(EMP_REC.EMPNO || '--' || EMP_REC.ENAME);
END LOOP;
-- 关闭游标,释放资源
CLOSE EMP_CURSOR;
END;
FOR IN 方式
DECLARE
-- 定义游标
CURSOR EMP_CURSOR IS
SELECT * FROM EMP;
-- 定义 游标行类型 变量
-- EMP_REC EMP_CURSOR % ROWTYPE;
BEGIN
-- 循环游标内容 [FOR IN LOOP END LOOP 方式]
-- 注意:1 不用打开游标 2 不用定义接受游标指向的行数据
-- 1 关键字 FOR IN
FOR EMP_REC IN EMP_CURSOR LOOP
-- 2 数据操作
DBMS_OUTPUT.put_line(EMP_REC.EMPNO || '--' || EMP_REC.ENAME);
END LOOP;
END;
3 动态游标DEMO
DECLARE
-- 定义动态游标类型
TYPE CURSORTYPE IS REF CURSOR;
-- 定义动态游标变量
V_CURSOR CURSORTYPE;
-- 定义 行类型 变量
EMP_REC EMP % ROWTYPE;
DEP_REC DEPT % ROWTYPE;
BEGIN
-- 1 打开游标并指向数据集
OPEN V_CURSOR FOR
SELECT * FROM EMP;
-- 2 循环游标
LOOP
-- 3 取出游标当前指向的行数据
FETCH V_CURSOR
INTO EMP_REC;
-- 4 判断退出条件
EXIT WHEN V_CURSOR % NOTFOUND;
-- 5 数据操作
DBMS_OUTPUT.put_line(EMP_REC.EMPNO || '--' || EMP_REC.ENAME);
END LOOP;
-- 6 关闭游标,释放资源
CLOSE V_CURSOR;
-- 再次打开游标,重复操作另一数据集
OPEN V_CURSOR FOR
SELECT * FROM DEPT;
LOOP
FETCH V_CURSOR
INTO DEP_REC;
EXIT WHEN V_CURSOR % NOTFOUND;
DBMS_OUTPUT.put_line(DEP_REC.DEPTNO || '--' || DEP_REC.DNAME);
END LOOP;
/*
-- 注意:动态游标类型不能使用 FOR IN 循环
FOR DEP_REC IN V_CURSOR LOOP
DBMS_OUTPUT.put_line(DEP_REC.DEPTNO || '--' || DEP_REC.DNAME);
END LOOP;*/
CLOSE V_CURSOR;
END;
4 系统游标DEMO
DECLARE
-- 定义系统变量
V_CURSOR SYS_REFCURSOR;
-- 定义 行类型 变量
EMP_REC EMP % ROWTYPE;
DEP_REC DEPT % ROWTYPE;
BEGIN
-- 1 打开游标并指向数据集
OPEN V_CURSOR FOR
SELECT * FROM EMP;
-- 2 循环游标
LOOP
-- 3 取出游标当前指向的行数据
FETCH V_CURSOR
INTO EMP_REC;
-- 4 判断退出条件
EXIT WHEN V_CURSOR % NOTFOUND;
-- 5 数据操作
DBMS_OUTPUT.put_line(EMP_REC.EMPNO || '--' || EMP_REC.ENAME);
END LOOP;
-- 6 关闭游标,释放资源
CLOSE V_CURSOR;
-- 再次打开游标,重复操作另一数据集
OPEN V_CURSOR FOR
SELECT * FROM DEPT;
LOOP
FETCH V_CURSOR
INTO DEP_REC;
EXIT WHEN V_CURSOR % NOTFOUND;
DBMS_OUTPUT.put_line(DEP_REC.DEPTNO || '--' || DEP_REC.DNAME);
END LOOP;
/*
-- 注意:动态游标类型不能使用 FOR IN 循环
FOR DEP_REC IN V_CURSOR LOOP
DBMS_OUTPUT.put_line(DEP_REC.DEPTNO || '--' || DEP_REC.DNAME);
END LOOP;*/
CLOSE V_CURSOR;
END;