一、游标和记录

此示例中的游标基于SELECT语句,该语句仅检索每个表行的两列。 如果它检索了六列或七,八,二十个呢?

DECLAREv_emp_id employees.employee_id%TYPE;v_last_name employees.last_name%TYPE;CURSOR emp_cursor ISSELECT employee_id, last_nameFROM employeesWHERE department_id = 30;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_last_name;...

该游标检索整个EMPLOYEES行。 凌乱而啰嗦,不是吗?

DECLAREv_emp_id employees.employee_id%TYPE;v_first_name employees.first_name%TYPE;v_last_name employees.last_name%TYPE;...v_department_id employees.department_id%TYPE;CURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_first_name, v_last_name ...v_department_id;...

比较下面的代码片段。 你看到了什么差异?

DECLAREv_emp_id ...;v_first_name ...;...v_department_id ...:CURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id =30;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_id, v_first_name,... v_department_id;...
DECLARECURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30;v_emp_recordemp_cursor%ROWTYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursorINTO v_emp_record;...

右侧的代码使用%ROWTYPE根据游标声明记录结构。 记录是PL / SQL中的复合数据类型。

二、PL / SQL记录的结构

记录是一种复合数据类型,由多个字段组成,每个字段都有自己的名称和数据类型。 您通过在字段名前加上记录名来引用每个字段。 %ROWTYPE用与它所基于的游标相同的字段声明一个记录。

(1)cursor_name%ROWTYPE的结构

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name, salary FROM employeesWHERE department_id = 30;v_emp_record emp_cursor%ROWTYPE;

(2)游标和%ROWTYPE

%ROWTYPE便于处理活动集的行,因为您可以简单地获取记录。

DECLARECURSOR emp_cursor ISSELECT * FROM employeesWHERE department_id = 30;
v_emp_record emp_cursor%ROWTYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id|| ' - '
||v_emp_record.last_name);END LOOP;CLOSE emp_cursor;
END;

(3)游标和%ROWTYPE:另一个例子

DECLARECURSOR emp_dept_cursor ISSELECT first_name, last_name, department_nameFROM employees e, departments dWHERE e.department_id = d.department_id;
v_emp_dept_record emp_dept_cursor%ROWTYPE;
BEGINOPEN emp_dept_cursor;LOOPFETCH emp_dept_cursor INTO v_emp_dept_record;EXIT WHEN emp_dept_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_dept_record.first_name||' – '||v_emp_dept_record.last_name||' – '||v_emp_dept_record.department_name);END LOOP;CLOSE emp_dept_cursor;
END;

三、显式游标属性

与隐式游标一样,有几个属性可用于获取有关显式游标的状态信息。 当附加到游标变量名称后,这些属性返回有关游标操作语句执行的有用信息。

(1)%ISOPEN属性

只有当光标打开时才可以获取行。 在执行提取以测试游标是否处于打开状态之前,请使用%ISOPEN游标属性。 %ISOPEN返回游标状态:如果打开则为TRUE,否则返回FALSE。

例:

IF NOT emp_cursor%ISOPEN THEN
OPEN emp_cursor;
END IF;
LOOPFETCH emp_cursor...

(2)%ROWCOUNT和%NOTFOUND属性

通常在循环中使用%ROWCOUNT和%NOTFOUND属性来确定何时退出循环。
对以下内容使用%ROWCOUNT游标属性:
•处理确切的行数

•计算循环中到目前为止获取的行数和/或确定何时退出循环

对以下内容使用%NOTFOUND游标属性:
•确定查询是否找到符合条件的行
•确定何时退出循环

(3)%ROWCOUNT和%NOTFOUND的示例

此示例显示了如何在循环中使用%ROWCOUNT和%NOTFOUND属性作为退出条件。

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employees;v_emp_record emp_cursor%ROWTYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%ROWCOUNT > 10 OR emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_emp_record.employee_id |' '|| v_emp_record.last_name);END LOOP;CLOSE emp_cursor;
END;

(4)SQL语句中的显式游标属性

您不能直接在SQL语句中使用显式游标属性。 以下代码返回一个错误:

DECLARECURSOR emp_cursor ISSELECT employee_id, salary FROM employeesORDER BY SALARY DESC;v_emp_record emp_cursor%ROWTYPE;v_count NUMBER;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_emp_record;EXIT WHEN emp_cursor%NOTFOUND;INSERT INTO top_paid_emps(employee_id, rank, salary)VALUES(v_emp_record.employee_id, emp_cursor%ROWCOUNT,v_emp_record.salary);
... 

Oracle入门(十四.11)之使用显式游标属性相关推荐

  1. Oracle入门(十四.10)之显式游标简介

    一.上下文区域和游标 Oracle服务器分配一个称为上下文区域的私有内存区域来存储由SQL语句处理的数据. 每个上下文区域(因此每个SQL语句)都有一个与其关联的游标.您可以将游标视为上下文区域的标签 ...

  2. Oracle 11g Release 1 (11.1) 游标——显式游标

    http://docs.oracle.com/cd/B28359_01/appdev.111/b28370/static.htm#CIHCAHJA 本文内容 声明一个游标 打开一个游标 用游标获取一个 ...

  3. Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  4. oracle 游标内存自动释放,详解Oracle隐式游标和显式游标

    游标是什么?就是在内存开辟的一块临时存储空间. 1.Oracle隐式游标 1.1Oracle有常用的哪些隐式游标 1.2 Oracle隐式游标演示 -- 隐式游标 (使用的表为Oracle默认自带的e ...

  5. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...

    1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...

  6. oracle显性游标,Oracle高级显式游标的使用

    1.参数化的游标作用:多次打开相同的游标,返回不同的结果集.游标声明部分的形参必须与OPEN语句中提供的实参相对应(数量与数据类型). 例1: DECLARE v_empno emp1.empno%T ...

  7. Oracle 游标遍历 显式游标 静态游标 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row

    -- Created on 2018/11/6 by YXQ  --显示游标 & 静态游标的处理 declare      --定义(游标一个可以遍历的结果集)      --声明cursor ...

  8. Oracle显式游标和隐式游标

    游标的概念: 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处 ...

  9. 【Oracle】PL/SQL 显式游标、隐式游标、动态游标

    在PL/SQL块中执行SELECT.INSERT.DELETE和UPDATE语句时,Oracle会在内存中为其分配上下文区(Context Area),即缓冲区.游标是指向该区的一个指针,或是命名一个 ...

最新文章

  1. golang strings.Fields 使用
  2. ubuntu下安装wine
  3. android之frame动画详解
  4. leetcode 954. Array of Doubled Pairs | 954. 二倍数对数组(Java)
  5. 9.停下来说说jquery
  6. jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会
  7. 石头机器人红灯快闪_机器人集体“快闪”活动爆红网络 “我是AI”与您相约智能新时代...
  8. 小型elf Hello,World程序
  9. java嵌套循环语句_Java学习笔记(七) 循环语句
  10. python中对字符串进行编码_Python 中的字符串编码
  11. SPH(光滑粒子流体动力学)流体模拟实现三:Marching Cube算法(2)
  12. vue3 ts 手动封装message消息组件
  13. FS FT DTFT DFT关系及频谱分析总结
  14. [Android 测试] 性能回归测试之 MonkeyRunner使用、插件扩展、结合批处理
  15. 苹果手机又刷屏啦!!它是如何做到的?
  16. 1049: 平方和与立方和 Python
  17. mt管理器去除应用广告
  18. latex里图片大小如何调整_如何使Latex中的图片放大依然清晰
  19. 电脑网络连接为什么常常连接不上
  20. 模式识别作业2——SYSU

热门文章

  1. Java substring() 方法
  2. [Java基础]自定义注解 格式本质
  3. 高等数学下-赵立军-北京大学出版社-题解-练习9.1
  4. 洛谷P2884 [USACO07MAR]Monthly Expense S
  5. [蓝桥杯2019初赛]等差数列-数列
  6. python窗口显示表格_pyqt 调用tablewidget窗口时无法显示窗口内容
  7. CF1028F. Make Symmetrical
  8. Codeforces Round #764 (Div. 3)
  9. 对弈(nim-k游戏博弈)
  10. CF891C-Envy【可撤销并查集】