PL/SQL游标

Oracle会创建一个存储区域,被称为上下文区域,用于处理SQL语句,其中包含需要处理的语句,例如所有的信息,行数处理,等等。

游标是指向这一上下文的区域。 PL/SQL通过控制光标在上下文区域。游标持有的行(一个或多个)由SQL语句返回。行集合光标保持的被称为活动集合。

可以命名一个光标,它可以在程序中获取和处理SQL语句,一次返回的行引用。有两种类型的游标:

  • 隐式游标

  • 显式游标

隐式游标

Oracle在一个SQL语句的执行,当没有显式游标的语句隐式游标时自动创建。程序员无法控制隐式游标其中的信息。

每当发出一个DML语句(INSERT,UPDATE和DELETE),隐式游标与此语句关联。对于INSERT操作时,光标保持一个需要插入的数据。对于UPDATE和DELETE操作,光标标识会受到影响的行。

在PL/SQL,可以参考最近的隐式游标的SQL游标,它有类似%FOUND,%ISOPEN,%NOTFOUND,和%ROWCOUNT属性。在SQL游标有额外的属性,%BULK_ROWCOUNT和%BULK_EXCEPTIONS,设计用于所有语句中使用。下表提供了最常用的属性的描述:

属性 描述
%FOUND 返回TRUE如果一个INSERT,UPDATE或DELETE语句影响了一行或多行或SELECT INTO语句返回一行或多行。否则,它将返回FALSE。
%NOTFOUND 逻辑相反%FOUND。返回TRUE如果一个INSERT,UPDATE或DELETE语句影响没有行或SELECT INTO语句返回任何行。否则,它将返回FALSE。
%ISOPEN 隐式游标总是返回FALSE,因为Oracle执行其相关的SQL语句之后自动关闭SQL游标。
%ROWCOUNT 返回受INSERT,UPDATE影响的行数,或DELETE语句,或者通过一个SELECT INTO语句返回。

任何SQL游标属性将被访问,SQL%attribute_name如示例图所示。

例子:

这里使用我们已经创建,并在前面的章节中使用的CUSTOMERS表。

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2000.00 |
| 2 | Khilan | 25 | Delhi | 1500.00 |
| 3 | kaushik | 23 | Kota | 2000.00 |
| 4 | Chaitali | 25 | Mumbai | 6500.00 |
| 5 | Hardik | 27 | Bhopal | 8500.00 |
| 6 | Komal | 22 | MP | 4500.00 |
+----+----------+-----+-----------+----------+

下面的程序将更新表,并通过每个客户的薪水增加500和使用SQL%ROWCOUNT属性来确定受影响的行数:

DECLARE
total_rows number(2);
BEGIN
UPDATE customers
SET salary = salary + 500;
IF sql%notfound THEN
dbms_output.put_line('no customers selected');
ELSIF sql%found THEN
total_rows := sql%rowcount;
dbms_output.put_line( total_rows || ' customers selected ');
END IF;
END;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

6 customers selected

PL/SQL procedure successfully completed.

如果查看customers表中的记录,会发现各行已更新:

Select * from customers;

+----+----------+-----+-----------+----------+
| ID | NAME | AGE | ADDRESS | SALARY |
+----+----------+-----+-----------+----------+
| 1 | Ramesh | 32 | Ahmedabad | 2500.00 |
| 2 | Khilan | 25 | Delhi | 2000.00 |
| 3 | kaushik | 23 | Kota | 2500.00 |
| 4 | Chaitali | 25 | Mumbai | 7000.00 |
| 5 | Hardik | 27 | Bhopal | 9000.00 |
| 6 | Komal | 22 | MP | 5000.00 |
+----+----------+-----+-----------+----------+

显式游标

显式游标是程序员定义游标获得更多的控制权的上下文的区域。显式游标应在PL/SQL块的声明部分中定义。这是创建一个SELECT语句返回多行。

创建显式游标语法是:

CURSOR cursor_name IS select_statement;

使用显式游标的工作包括四个步骤:

  • 声明游标用于初始化在存储器

  • 打开游标分配内存

  • 获取游标检索数据

  • 关闭游标释放分配的内存

声明游标

声明游标定义游标的名称和相关的SELECT语句。例如:

CURSOR c_customers IS
SELECT id, name, address FROM customers;

打开游标

打开游标游标分配内存,使得它准备取的SQL语句转换成它返回的行。例如,我们将打开上述定义的游标如下:

OPEN c_customers;

获取游标

获取游标涉及一次访问一行。例如,将获取行从上面打开的游标,如下所示:

FETCH c_customers INTO c_id, c_name, c_addr;

关闭游标

关闭游标来释放分配的内存。例如,将关闭前面打开的游标,如下所示:

CLOSE c_customers;

例子:

下面是一个完整的例子来说明明确游标的概念:

DECLARE
c_id customers.id%type;
c_name customers.name%type;
c_addr customers.address%type;
CURSOR c_customers is
SELECT id, name, address FROM customers;
BEGIN
OPEN c_customers;
LOOP
FETCH c_customers into c_id, c_name, c_addr;
EXIT WHEN c_customers%notfound;
dbms_output.put_line(c_id || ' ' || c_name || ' ' || c_addr);
END LOOP;
CLOSE c_customers;
END;
/

当上述代码在SQL提示符执行时,它产生了以下结果:

1 Ramesh Ahmedabad
2 Khilan Delhi
3 kaushik Kota
4 Chaitali Mumbai
5 Hardik Bhopal
6 Komal MP PL/SQL procedure successfully completed.

SQL记录-PLSQL游标的更多相关文章

  1. SQL记录-PLSQL记录

    PL/SQL记录   PL/SQL记录就是可以容纳不同类型的数据项的数据结构.记录由不同字段,类似于数据库表的行. 例如,要保留跟踪图书馆中的书籍.可能要跟踪有关每本书下面的属性类似:标题,作者,主题 ...

  2. SQL记录-PLSQL基本语法与数据类型

    PL/SQL基本语法 PL/SQL是一种块结构的语言,这意味着PL/SQL程序被划分和编写代码的逻辑块.每块由三个子部分组成: S.N. 段和说明 1 声明 此部分开头使用关键字DECLARE.它是一 ...

  3. SQL记录-PLSQL包

    PL/SQL包 PL/SQL包是组逻辑相关的PL/SQL类型,变量和子程序模式对象. 程序包将有两个强制性的部分: 包装规范定义 包体或定义 包装规范定义 规范是接口到包.它只是声明的类型,变量,常量 ...

  4. SQL记录-PLSQL数组

    PL/SQL数组 PL/SQL程序设计语言提供叫一种叫做VARRAY的数据结构,其可存储相同类型元素的一个固定大小的连续集合.VARRAY用于存储数据的有序集合,但它往往是更加有用认为数组作为相同类型 ...

  5. SQL记录-PLSQL条件控制

    PL/SQL条件控制   决策结构需要程序员指定一个或多个条件要计算,或由程序进行测试,如果条件被确定为真那么一条或多条语句被执行,如果要被执行的其它语句条件被确定为假,则选其它执行块. 以下是从在大 ...

  6. SQL记录-PLSQL变量与常量文字

    PL/SQL变量   变量是只不过是一个给定的存储区域,程序可以操纵的名称.PL/SQL每个变量具有一个特定的数据类型,它决定了大小和变量的存储器的值,可以说存储器和设置操作可以施加到可变内被存储的范 ...

  7. SQL记录-PLSQL触发器

    PL/SQL触发器 触发器是存储程序,它会自动执行或发射当一些事件发生.触发器,事实上,写入响应于以下任一事件将被执行: 数据库操作(DML)语句(DELETE,INSERT,UPDATE或) 数据库 ...

  8. SQL记录-PLSQL异常

    PL/SQL异常   程序执行过程中出现错误情况被称为在PL/SQL异常. PL/SQL支持程序员在程序中使用异常块捕获这样的条件并采取适当的动作应对错误情况.有两种类型的异常: 系统定义的异常 用户 ...

  9. SQL记录-PLSQL函数

    PL/SQL函数 PL/SQL函数与过程相同,不同之处在于函数有一个返回值.因此,前面的章节中的所有讨论都适用于函数. 创建函数 建立一个独立函数可以使用CREATE FUNCTION语句创建.CRE ...

随机推荐

  1. 【Orleans开胃菜系列1】不要被表象迷惑

    [Orleans开胃菜系列1]不要被表象迷惑 /** * prism.js Github theme based on GitHub's theme. * @author Sam Clarke */ ...

  2. java拦截器(Interceptor)学习笔记

    1,拦截器的概念    java里的拦截器是动态拦截Action调用的对象,它提供了一种机制可以使开发者在一个Action执行的前后执行一段代码,也可以在一个Action执行前阻止其执行,同时也提供了 ...

  3. tcp ,http .udp

    三次握手,四次挥手要知道,记住. 计算机协议常见面试题,学会了,记住.会运用.

  4. 绕WAF&安全狗新姿势

    俗话说只要思路宽,绕狗绕的欢.前段时间我有尝试着用以下的方法绕狗,效果还不错.不过这方法呢也许这段时间可以绕过,过段时间可能就失效了,大家还是要多去尝试找到更多的方法. 举例-->整型注入 绕过 ...

  5. Linux内核分析——第八周学习笔记

    实验作业:进程调度时机跟踪分析进程调度与进程切换的过程 20135313吴子怡.北京电子科技学院 [第一部分]理解Linux系统中进程调度的时机 1.Linux的调度程序是一个叫schedule()的 ...

  6. 2013337朱荟潼 Linux第四章读书笔记——进程调度

    第4章 进程调度 0. 总结 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时 ...

  7. Data Plane

    2015-2018,部分关于SDN数据平面的故障恢复文献粗读 SHEAR: A highly available and flexible network architecture marrying ...

  8. 学习Java并发的课程

    https://www.javaspecialists.eu/courses/concurrency.jsp http://www.jconcurrent.com/ javaConcurrentAni ...

  9. CentOS7 安装redis 并且设置成服务自动启动

    通过 博客园 https://www.cnblogs.com/zuidongfeng/p/8032505.html 学习以及记录 1. 下载redis 现在最新的stable版本是 4.0.10 wg ...

  10. css文本垂直居中

    1,一般flexca 2,行高 3,行高加边框或者透明边框