根据我们之前了解到的情况,SQL是面向集合的,我们的查询结果一般包含多条数据,而在PL/SQL 中的变量一般只能存放一条数据,因此变量是无法满足我们的需求的。这时候我们就需要引入游标来为我们解决问题了。

  我们知道在 PL/SQL 中可以使用数据控制语言(DML)对数据进行操作,而在使用这些的时候 Orcale 会在内存中为其分配一个缓存区。而游标就是指向该缓存区的指针。它可以对查询结果集的每一行数据分别进行单独的处理。

  游标分为显式游标和隐式游标。显式游标是由用户声明操作的一种游标,而隐式游标是 Orcale 为所有的操作语言自动声明和操作的游标。

显式游标

  对于显式游标的操作分为:声明,打开,提取,关闭。

  1. 声明游标

    在游标的声明中定义了游标的名字而且这个游标和一个 SELECT 关联起来。除此之外显式游标必须在 DEXLARE 中。它的语法如下:

CURSOR <游标名> IS SELECT <语句>

  注意:这里的SELECT 语句是可以带有 UNION 或者 MINUS 的语句。

  2. 打开游标

    语法如下:

OPEN <游标名>;

  打开游标就会执行定义的 SELECT语句,执行完毕后,查询出来的结果会放入内存,游标的指针会指向查询结果的头部,

  3. 提取游标

    打开游标后的工作就是从查询出来的集合进行取值了,取值的语句是 FETCH 语法有两种格式:

FETCH <游标名> INTO <变量列表>;
FETCH <游标名> INTO PL/SQL 记录;

    FETCH 每执行一次游标会向后移动一次直到结束位置。

  4. 关闭游标

CLOSE <游标名>;

   5. 例子

--创建临时表
create table t_emp
( tempne number(4) primary key,
tename varchar2(20)
);
create table t_emp2
( tempne number(4) primary key,
tename varchar2(20)
); DECLARE
emp_no number(4); --定义变量
emp_nanme varchar2(20);
CURSOR emp_cur IS --定义游标
SELECT empno, ename
FROM emp;
BEGIN
OPEN emp_cur; --打开游标
--将第一行的数据放入变量中,之后游标后移
FETCH emp_cur INTO emp_no, emp_nanme;
LOOP
EXIT WHEN NOT emp_cur%FOUND; --如果游标已经到末尾结束
IF emp_no = '7839' THEN
INSERT INTO t_emp values(emp_no,emp_nanme);
else
INSERT INTO t_emp2 values(emp_no,emp_nanme);
END IF;
FETCH emp_cur INTO emp_no, emp_nanme;
END LOOP;
CLOSE emp_cur; --关闭游标
END;
/

 隐式游标

  上面我们学到了显示游标的使用,接下来我们说下隐式游标。当我们在PL/SQL 中直接使用 SELECT 语句进行操作,则就是隐式的使用了游标,这就是隐式游标。这种游标无需定义,也不需要打开和删除。如下所示

BEGIN
SELECT empno, ename INTO emp_no, emp_nanme FROM emp WHERE empno = 7839;
END

  对于隐式游标来说必须要有一个 INTO 子句,因此对于隐式游标来说 SELECT 子句的返回值必须只有一行数据。

orcale 之 PL/SQL的游标的更多相关文章

  1. PL/SQL使用游标CURSOR

    一.使用游标 对于DML语句和单行select into ,oracle自动分配隐形游标.处理select返回多行语句,可以使用显式游标. 使用显示游标处理多行数据,也可使用SELECT..BULK ...

  2. orcale 之pl/sql例外

    orcale 中的例外我们可以看作是其他编程语言中的异常,是为了增强语言的健壮性和容错性. 在orcale中常见的有以下几种: No_data_found 很容易理解就是没有数据返回. Too_man ...

  3. PL/SQL之--游标

    一.游标简介 在PL/SQL中执行SELECT.INSERT.DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),也称为缓冲区.游标是指向该区的一个指 ...

  4. Oracle PL/SQL,游标,过程

    1.PL/SQL  语法相关 -- SQL 语言只是访问,操作数据库的语言,而比并不是程序设计语言,因此不能用于程序开发. -- PL/SQL 是在标准SQl语言上进行过程性扩展后形成的程序设计语言, ...

  5. PL/SQL之游标的使用

    Oracle中的游标有两种: 显式游标 用CURSOR...IS 命令定义的游标,它可以对查询语句(SELECT)返回的多条记录进行处理. 隐式游标 是在执行插入(INSERT).删除(DELETE) ...

  6. PL/SQL编程—游标

    一.游标的相关概念: 定义: 游标它是一个服务器端的存储区,这个区域提供给用户使用,在这个区域里 存储的是用户通过一个查询语句得到的结果集,用户通过控制这个游标区域当中 的指针 来提取游标中的数据,然 ...

  7. PL/SQL 04 游标 cursor

    --游标 declare  cursor 游标名字  is  查询语句;begin  其他语句;end; --游标的属性%FOUND%NOTFOUND%ISOPEN%ROWCOUNT(当前游标的指针位 ...

  8. 在PL/SQL使用游标获取数据及动态SQL

    1.游标概念: 当在PL/SQL块中执行DML(增删改)时,Oracle会为其分配上下文区(Context Area),游标是指向上下文区的指针 2.  游标分类: A.  隐式游标 a.  在PL/ ...

  9. orcale 之PL/SQL 控制语句

    控制语句是PL/SQL 的关键所在.只有学好这些控制语句才能在工作中更好的实现各种的功能. 选择结构 1. IF 语句 和其他的编程语言很类似.它的具体机构如下: IF(条件)THEN {语句} EL ...

随机推荐

  1. phonegap/cordova学习建议

    在技术群里面,一直有一些新人进来,问了一些让人可笑不得的问题.国内的资料相对比较少,而且很旧,都是一些2.X版本的资料.因此想写一些东西,帮助一下新人,让他们少走弯路. 首先说一些很多人问的问题,个人 ...

  2. 【C++】C++中的操作符重载

    C++中的操作符重载使得对于类对象的操作更加方便和直观,但是对于各种操作符重载的规则以及语法形式,一直以来都是用到哪一个上stackoverflow上查找,在查找了四五次之后,觉得每次麻烦小总结一下. ...

  3. 解决同一程序在并行同时调用时,出现资源等待错误-使用DBMS_LOCK.sleep

    解决同一程序被并行同时调用时,出现资源等待错误问题. 使用DBMS_LOCK.sleep (10); PROCEDURE prc_lock_test(v_engine_id in varchar, v ...

  4. solrcloud 搭建资料

    SolrCloud4.9+zookeeper在CentOS上的搭建与安装 http://www.open-open.com/lib/view/open1411307048750.html 官网教程 h ...

  5. centos 下wps 与goland 不能输入中文的解决办法

    输入法:CentOS7自带ibus,如果你用的是fcitx请在对应的地方进行修改 系统:CentOS7,这个方案应该适用于大多数Linux发行版本 intelliJ goland中文输入法问题解决 首 ...

  6. Python实现简单登陆验证(文件操作)

    利用python编写一个简单的登陆验证 代码主要功能: 利用Python实现简单的登陆验证,代码主要有两个部分组成: 第一部分:登陆页面,作用是实现用户名和密码的输入 利用两个输入函数input()来 ...

  7. iOS 错误 undefined symbols for architecture i386

    undefined symbols for architecture i386 这个错误困扰了我几个小时. 网上很多问这个问题的,回答基本上都是说在 target 里面去的 armv64 什么什么的. ...

  8. Vue的基本认识与使用

    什么是Vue? Vue是一个渐进式的js框架,采用的是MVVM模式的双向绑定, Vue的使用 引入vue        <script src="vuejs/vue.js"& ...

  9. 红与黑(DFS)

    描述有一间长方形的房子,地上铺了红色.黑色两种颜色的正方形瓷砖.你站在其中一块黑色的瓷砖上,只能向相邻的黑色瓷砖移动.请写一个程序,计算你总共能够到达多少块黑色的瓷砖.输入包括多个数据集合.每个数据集 ...

  10. “全栈2019”Java多线程第八章:放弃执行权yield()方法详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java多 ...