Oracle游标

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;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值