【翻译】Oracle游标详细说明

这篇文章是选取官方文档的部分章节翻译过来的,去除了原文中的例子,并在结尾补充了几个例子。有兴趣的朋友可以点击文章末尾的连接去阅读官方文档。

一、游标的定义

游标是指向专用SQL区域的指针,该区域存储有关处理特定SELECT或DML语句的信息。本章解释的游标是会话游标。会话游标存在于会话中直到会话结束。由PL/SQL创建和管理的游标称为隐式游标,由用户创建和管理的游标称为显式游标。你可以通过游标的属性获取任意会话游标的相关信息。通过查询动态性能视图V$OPEN_CURSOR,可以列出当前已经打开和解析的游标。

二、隐式游标

每次执行select 或DML操作时,都会生成隐式游标。用户不能控制隐式游标,但可以通过游标的属性获取游标的信息。

隐式游标属性的语法是SQLattribute(因此隐式游标也通常叫做SQL游标)。SQLattribute总是指向最近运行的select或DML语句。如果最近没有运行这样的语句,则属性返回NULL。

当语句运行结束时,隐式游标关闭,但是它的属性会被保留到另一条select或DML语句执行。最近的语句运行的结果可能属于不同的值,如果要保留属性值供以后使用,可以将其保存在本地变量中。另外,其他的操作,如子程序的调用,可能在你测试之前改变属性值。

隐式游标的属性有以下几种:

属性 说明 备注
SQL%ISOPEN FALSE 隐式游标总是在与其相关联的语句结束之后关闭,因此总是返回FALSE
SQL%FOUND NULL 没有执行select或DML操作
TRUE select语句返回一行或多行或者DML操作影响了一行或者多行
FALSE 其他情况
SQL%NOTFOUND NULL 没有执行select或DML操作 在select into中无用,没有值时会报no_data_found的错误;有值时验证已经没有意义。
TRUE select语句返回一行或多行或者DML操作影响了一行或者多行
FALSE 其他情况
SQL%ROWCOUNT NULL 没有执行select或DML操作 select into中返回多行时会报too_many_data的错误,并且返回1.
数值 返回的数值表示select返回了多少行以及DML操作影响了多少行
SQL%BULK_ROWCOUNT 数值
FORALL语句完成后,从隐式游标属性SQL%BULK_ROWCOUNT获取每个DML语句影响的行数。
SQL%BULK_EXCEPTIONS

FORALL语句完成后,如果执行期间有异常生成,会将异常数据保存在SQL%BULK_EXCEPTIONS中。

三、显式游标

显式游标由用户创建并管理。用户在使用显式游标之前必须声明和定义游标名称并将其与查询相关联(通常,查询会返回多行)。然后用户可以通过以下方式处理查询结果集:

使用open命令打开游标,使用fetch获取行,使用close关闭游标;

与隐式游标不同,可以通过名称引用显示游标或游标变量。因此,显式游标或游标变量称为命名游标。

3.1 声明和定义显式游标

用户可以首先声明一个显式游标,然后在同一个块,子程序或包中定义它;或者同时声明和定义它。

只声明游标,具有如下的语法:

CURSOR cursor_name [ parameter_list ] RETURN return_type;

声明游标并定义游标的语法:

CURSOR cursor_name [ parameter_list ] [ RETURN return_type ] IS select_statement;

声明显式游标的例子:

DECLARE CURSOR c1 RETURN departments%ROWTYPE; -- 声明C1

CURSOR c2 IS SELECT employee_id,job_id,salary-- 声明并且定义 c2

FROM employees

WHERE salary > 2000;

CURSOR c1 RETURN departments%ROWTYPE IS-- 定义 c1,-- 重复return type

SELECT * FROM departments

WHERE department_id = 110;

CURSOR c3 RETURN locations%ROWTYPE; -- 声明c3

CURSOR c3 IS -- 定义c3,-- 忽略 return type

SELECT * FROM locations

WHERE country_id = 'JP';

BEGIN NULL;

END; /

3.2 打开和关闭游标

声明和定义显式游标后,可以使用OPEN语句打开它;您使用CLOSE语句关闭一个打开的显式游标,从而允许重用其资源。关闭游标后,无法从其结果集中提取记录或引用其属性。

用户可以重新打开一个已经关闭的游标。游标在重新打开之间必须要被关闭。否则,PL/SQL会引发预定义异常CURSOR_ALREADY_OPEN.

3.3 使用显式游标获取数据

打开一个显式游标后,可以使用FETCH语句获取结果集。返回一行的FETCH语句的基本语法是:

FETCH cursor_name INTO into_clause

into_clause是一个变量列表或单个记录变量。 对于查询返回的每个列,变量列表或记录必须具有对应的类型兼容变量或字段。%TYPE和%ROWTYPE属性可用于声明变量和记录以在FETCH语句中使用。FETCH语句检索结果集的当前行,将该行的列值存储到变量或记录中,并将光标前移到下一行。通常,在LOOP语句中使用FETCH语句,当FETCH语句用完行时退出。 要检测此退出条件,请使用游标属性%NOTFOUND。因为当FETCH语句不返回任何行时,PL/SQL不会引发异常。

3.4 显式游标查询中的变量

显式游标查询可以引用其作用域中的任何变量。 当打开显式游标时,PL / SQL将评估查询中的任何变量,并在标识结果集时使用这些值。 稍后更改变量的值不会更改结果集。【定义游标时,游标中结果集就已经确定,如要改变结果集,必须关闭游标并重新打开游标】

3.5 当显式游标列需要别名时

当显式游标查询包含虚拟列(表达式)时,如果满足以下任一条件,则该列必须具有别名:

1、使用游标读取使用%ROWTYPE声明的记录。

2、需要引用虚拟列

3.6 接受参数的显示游标

用户可以创建具有形式参数的显式游标,然后在每次打开游标时将不同的实际参数传递到游标。 在游标查询中,可以在可以使用常量的任何位置使用正式的光标参数。在光标查询之外,用户不能引用正式的光标参数。

3.7 显示游标的属性

%ISOPEN TRUE:游标打开状态;FALSE:其他状态。

%FOUND NULL:显示游标打开但是还没有获取第一行

TRUE:从显式游标的最近一次提取返回了一行

FALSE:其他情况

%NOTFOUND NULL:显示游标打开但是还没有获取第一行

FALSE:从显式游标的最近一次提取返回了一行

TRUE:其他情况

%ROWCOUNT:在显式游标打开后但在第一次提取之前为零;否则就获取行数。

四、例子

4.1 获取tabs中表名称的两个例子

方法一:将结果集装在记录中

declare

--表行的记录变量

cursor mycur is select * from tabs;

cur_result tabs%rowtype;

begin

open mycur;--打开游标

loop

fetch mycur into cur_result;--获取数据

exit when mycur%notfound;--退出循环

dbms_output.put_line('The table name is '||cur_result.table_name);

end loop;

close mycur;--关闭游标

end;

方法二:将结果集装在变量中

declare

--变量

cursor mycur is select table_name from tabs;

v_tablename tabs.table_name%type;

begin

open mycur;--打开游标

loop

fetch mycur into v_tablename;--获取数据

exit when mycur%notfound;--退出循环

dbms_output.put_line('The table name is '||v_tablename);

end loop;

close mycur;--关闭游标

end;

方法三:将结果集装在游标类型的row%type中

declare

--表行的记录变量

cursor mycur is select table_name from tabs;

cur_result mycur%rowtype;

begin

open mycur;--打开游标

loop

fetch mycur into cur_result;--获取数据

exit when mycur%notfound;--退出循环

dbms_output.put_line('The table name is '||cur_result.table_name);

end loop;

close mycur;--关闭游标

end;

4.2 动态游标

静态游标的声明与定义必须在同一个块中执行,动态游标可以在begin之前声明游标,在打开游标时定义sql语句,即可以使用open cursor_name for sql_statement的形式打开游标。sql_statement可以是静态的SQL语句,也可以是动态的SQL语句。

例一:静态的SQL语句

declare

--表行的记录变量

type cursor_type is ref cursor;

mycur cursor_type;

cur_result tabs%rowtype;

begin

open mycur for select * from tabs;--打开游标

loop

fetch mycur into cur_result;--获取数据

exit when mycur%notfound;--退出循环

dbms_output.put_line('The table name is '||cur_result.table_name);

end loop;

close mycur;--关闭游标

end;

例二:动态的SQL语句

declare

type cursor_type is ref cursor;

mycur cursor_type;

cur_result tabs%rowtype;

v_sql varchar2(1000);

begin

v_sql:='select * from tabs';

open mycur for v_sql;--打开游标

loop

fetch mycur into cur_result;--获取数据

exit when mycur%notfound;--退出循环

dbms_output.put_line('The table name is '||cur_result.table_name);

end loop;

close mycur;--关闭游标

end;

五、其他说明

5.1 Oracle游标的官方文档

http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/static.htm#LNPLS00602

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符串转Oracle的insert into的小程序。
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远端的监听服务来找问题,在远端查看监听服务状态(具体看下面的解决方案会详细呈现),服务是否开启,另外查看监听端点概要是否存在host未指向到计算名的,如无直接进入监听配置文件listener.ora内添加指向即可。2、查看监听服务状态 lsnrctl status,右边为远端端点状态,未添加host指向到计算名;1、本地及远端安装好Oracle并配置好连接,Oracle服务和监听已启动;1、远程Oracle数据库:Oracle11g R2。或者进入下述服务手动重启。,再进行远程连接即可。_ora-12541:tns:无监听程序
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语句转oracle
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library_cx_oracle.databaseerror: dpi-1047: cannot locate a 64-bit oracle client libr
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Oracle数据库的核心要素,包括体系结构、存储结构以及各类参数。通过解析Oracle数据库的体系结构,读者可以深入了解其内部组成和工作原理。存储结构部分介绍了数据在Oracle中的存储方式,从表空间到数据文件的层层逻辑。最后,我们深入探讨了Oracle数据库中各类参数的作用和配置方法,帮助读者更好地理解和优化数据库性能。本文旨在帮助读者全面理解Oracle数据库的运作机制,为其在实践中的应用提供基础和指导。
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时)由于平时默认每天只收集4小时,时间有点短了,改成每天可收集8小时。oracle 18c中默认是打开的。查看当前自动收集统计信息的时间。_oracle自动收集统计信息
文章浏览阅读929次,点赞18次,收藏20次。只有assm(Automatic Shared Memory Management)模式可以使用大页,需要关闭amm(Memory Manager Process)HugePages_Free: 306 (空闲306页,已使用306-306=0页)防止oracle使用的内存交换,所以设置的大小与oracle配置的sga、pga相关。HugePages_Rsvd: 0 (操作系统承诺给oracle预留的页数)HugePages_Total: 306 (总共306页)_oracle11g 大页
文章浏览阅读801次。例如:10046:0,1,4,8,12。默认redo日志有三个,大小为50M,循环覆盖使用。redo log再覆盖之前,会被归档,形成归档日志。答:不同事件,不同级别。trace的不同级别?_oracle 日志
文章浏览阅读4.2k次,点赞84次,收藏77次。主要讲解MySQL中SQL的DDL语句,其中包括对数据库和表的一系列操作。_sql ddl 新增字段 mysql
文章浏览阅读1.1k次。ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。Method =>'C',物化视图有三种刷新方式:COMPLETE、FAST和FORCE。物化视图会占用空间,一半可用于大量数据查询时,减缓主表的查询压力使用。例如创建一个物化视图,让对接单位查询。_oracle物化视图定时刷新
文章浏览阅读713次,点赞21次,收藏18次。1.背景介绍在当今的大数据时代,数据量越来越大,传统的关系型数据库已经无法满足业务需求。因此,NoSQL数据库技术迅速崛起,成为企业和开发者的首选。Oracle NoSQL Database是Oracle公司推出的一款分布式NoSQL数据库产品,具有高性能、高可用性和易于扩展等特点。在本文中,我们将深入了解Oracle NoSQL Database的集成与开发者工具,帮助您更好地掌握这款产品的...
文章浏览阅读2.5k次,点赞2次,收藏4次。今天遇见一个问题需要将字段中包含中文字符串的筛选出来。_oracle查询包含中文字符
文章浏览阅读802次。arcmap 在oracle删除表重新创建提示表名存在解决放啊
文章浏览阅读4.3k次,点赞2次,收藏4次。Oracle连接数据库提示 ORA-12638:身份证明检索失败_ora-12638
文章浏览阅读3.4k次,点赞6次,收藏25次。etc/profile是一个全局配置文件,所有用户登录都会使用该文件构建用户环境。与windows配置环境变量是一个道理。选择Linux系统,找到适合自己系统的安装包,我的是CentOS 8 x64。接下来需要登陆Oracle账户才能下载,无账户的可以自己注册一个。Linux中export 命令用于设置或显示环境变量。模式,利用上下键到文档最后,添加以下代码。出现如图所示版本号字样,则说明安装成功。点击下载,勾选1,点击2。记住完整路径用于后面配置。找到Java并点击进去。往下翻,找到Java8。_linux安装jdk1.8
文章浏览阅读2.4w次,点赞26次,收藏109次。JDK 是的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,其中JDK包含了 Java 运行环境(Java Runtime Envirnment,简称 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基础类库(比如 rt.jar)。最主流的 JDK 是Oracle公司发布的 JDK,除了 Oracle JDK(商业化,更稳定)之外,还有很多公司和组织开发了属于自己的 JDK,比较有名的有IBM JDK(更适合 IBM) 和OpenJDK。_jdk安装教程
文章浏览阅读7.5w次。出现 “java.sql.SQLNonTransientConnectionException:Could not create connection to database server” 的错误通常是由于无法连接到数据库服务器引起的。_java.sql.sqlnontransientconnectionexception: could not create connection to
文章浏览阅读849次,点赞7次,收藏10次。在ClickHouse中创建用户、数据库并进行权限分配是一个重要的管理任务,它涉及到安全性和访问控制。下面是一个基本的指南来帮助你完成这些操作:1. 创建数据库首先,需要创建一个数据库。使用以下命令:CREATE DATABASE IF NOT EXISTS your_database_name;将 your_database_name 替换为你想要的数据库名。2. 创建用户接下来,创建一个新用户。使用以下命令:CREATE USER your_username IDENTIFIED WIT_在clickhouse中如何创建用户 赋权
文章浏览阅读1.2k次,点赞53次,收藏39次。本文是一篇关于Oracle数据库安装和使用的博文摘要。作者以轻松幽默的笔调介绍了自己在实验中掌握的Oracle数据库基本操作,包括使用组件查看命令、配置数据库监听器等。作者也分享了在实验中遇到的一些有趣问题,如SQL语句缺少分号导致的意外错误。此外,作者还强调了登录sys用户和启动实例加载数据库的注意事项,并鼓励读者面对挑战时保持乐观,不断提升自己的能力。整体风格风趣严谨,引人入胜。
文章浏览阅读820次,点赞17次,收藏16次。KingbaseES、xml、dbms_xmlgen、SETSKIPROWS、人大金仓、KingbaseES兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。对于通过查询字符串直接转化的方式,无法跳过若干行进行查询,只能直接将表格中的所有数据转化为XML文档。