您的位置:首页 > 数据库 > Oracle

Oracle游标

2016-04-20 23:26 447 查看
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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: