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

、上下文区域和游标

Oracle服务器分配一个称为上下文区域的私有内存区域来存储由SQL语句处理的数据。 每个上下文区域(因此每个SQL语句)都有一个与其关联的游标。您可以将游标视为上下文区域的标签,或者将其作为指向上下文区域的指针。 事实上,一个游标就是这两个项目。



二、隐式和显式游标

有两种类型的游标:
•隐式游标:由Oracle自动为所有SQL DML语句(INSERT,UPDATE,DELETE和MERGE)以及仅返回一行的SELECT语句定义。
•显式游标:由程序员为返回多行的查询声明。 您可以使用显式游标来命名上下文区域并访问其存储的数据。


三、隐式游标的限制

EMPLOYEES表中有多行:

DECLAREv_salary employees.salary%TYPE;
BEGINSELECT salary INTO v_salaryFROM employees;DBMS_OUTPUT.PUT_LINE(' Salary is : '||v_salary);
END;

ORA-01422: exact fetch returns more than requested number of rows


四、显式游标

使用显式游标,您可以从数据库表中检索多行,为检索到的每行提供一个指针,并且一次处理一行。 以下是使用显式游标的一些原因:
•这是PL / SQL从表中检索多行的唯一方法。
•每行由一个单独的程序语句提取,使程序员可以更好地控制行的处理。

(1)显式游标的例子

以下示例使用明确的游标来获取亚洲国家的国家名称和国定假日。

DECLARECURSOR wf_holiday_cursor IS   --定义游标SELECT country_name, national_holiday_dateFROM wf_countries where region_id IN(30,34,35);v_country_name wf_countries.country_name%TYPE;v_holiday wf_countries.national_holiday_date%TYPE;
BEGINOPEN wf_holiday_cursor; --打开游标LOOPFETCH wf_holiday_cursor INTO v_country_name, v_holiday;  --提取游标一行EXIT WHEN wf_holiday_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_country_name||' '||v_holiday);END LOOP;   CLOSE wf_holiday_cursor;  --关闭游标
END;

(2)显式游标操作

由多行查询返回的行集称为活动集,并存储在上下文区域中。 它的大小是符合您的搜索条件的行数。



将上下文区域(由光标命名)看作一个框,并将活动集作为框的内容。 为了获得数据,您必须打开盒子并逐个从盒子中取出每一行。 完成后,您必须关闭该框。

(3)控制显式游标


(4)声明和控制显式游标



五、使用显式游标的步骤

您首先声明一个游标,然后使用OPEN,FETCH和CLOSE语句来控制游标。

1.在声明部分中声明游标。
2.打开光标。
3.从活动集中取出每行,直到该框为空。

4.关闭光标。

OPEN语句执行与游标相关的查询,标识结果集并将光标定位在第一行之前。 FETCH语句检索当前行并将光标前进到下一行。 当最后一行被处理完后,CLOSE语句禁用游标。

(1)声明游标的语法

游标的活动集由游标声明中的SELECT语句确定。
句法:
CURSOR cursor_name ISselect_statement;
在语法中:
cursor_name是PL / SQL标识符
select_statement是一个没有INTO子句的SELECT语句

(2)声明游标示例1

声明emp_cursor游标以检索部门中使用department_id为30的员工的employee_id和last_name列。
DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employeesWHERE department_id =30;
...

(3)声明游标示例2

声明dept_cursor游标以检索具有location_id 1700的部门的所有详细信息。您想按department_name的升序序列提取和处理这些行。

DECLARECURSOR dept_cursor ISSELECT * FROM departmentsWHERE location_id = 1700ORDER BY department_name;
...

(4)声明游标示例3

游标声明中的SELECT语句可以包含连接,组函数和子查询。 此示例检索每个至少有两名员工的部门,并给出部门名称和员工人数。
DECLARECURSOR dept_emp_cursor ISSELECT department_name, COUNT(*) AS how_manyFROM departments d, employees eWHERE d.department_id = e.department_idGROUP BY d.department_nameHAVING COUNT(*) > 1;
...


六、声明游标的指南

在声明游标时:
•不要在游标声明中包含INTO子句,因为它稍后出现在FETCH语句中。
•如果需要处理特定顺序的行,则在查询中使用ORDER BY子句。
游标可以是任何有效的SELECT语句,包括连接,子查询等等。

•如果游标声明引用任何PL / SQL变量,则必须在声明游标之前声明这些变量。

(1)打开光标

OPEN语句执行与游标关联的查询,标识活动集并将光标指针定位到第一行。 OPEN语句包含在PL / SQL块的可执行部分中。
DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employeesWHERE department_id = 30;
...
BEGINOPEN emp_cursor;
...
OPEN语句执行以下操作:
1.为上下文区域分配内存(创建框)
2.在游标声明中执行SELECT语句,将结果返回到活动集(用数据填充框)

3.将指针定位到活动集中的第一行

(2)从光标获取数据

FETCH语句一次从光标中检索一行。 每次提取后,光标前进到活动集中的下一行。 两个变量v_empno和v_lname被声明为保存游标中的取值。

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employeesWHERE department_id =10;v_empno employees.employee_id%TYPE;v_lname employees.last_name%TYPE;
BEGINOPEN emp_cursor;FETCH emp_cursor INTO v_empno, v_lname;DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);...
END;

输出:

200 Whalen

Statement processed.

您已成功将光标中的值提取到变量中。 但是,第30部门有6名员工。只有一行被提取。 要获取所有行,您必须使用循环。

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employeesWHERE department_id =50;v_empno employees.employee_id%TYPE;v_lname employees.last_name%TYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_empno, v_lname;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);END LOOP; …
END;

输出:

124 Mourgos

141 Rajs
142 Davies
143 Matos
144 Vargas
Statement processed.

(3)从光标获取数据的准则

从光标获取数据时遵循以下准则:

•在FETCH语句的INTO子句中包含与SELECT语句中的列相同数量的变量,并确保数据类型兼容。

•将每个变量与位置上的列进行匹配。

•测试以查看游标是否包含行。 如果提取没有获取值,则在活动集中没有剩余行要处理,并且不记录错误。 最后一行被重新处理。

•您可以使用%NOTFOUND游标属性来测试退出条件。

从光标获取数据示例1

这个例子有什么问题?

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name, salary FROM employeesWHERE department_id =30;v_empno employees.employee_id%TYPE;v_lname employees.last_name%TYPE;v_sal employees.salary%TYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_empno, v_lname;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);END LOOP; …
END;
从光标获取数据示例2

部门10中只有一名员工。执行此示例时会发生什么?

DECLARECURSOR emp_cursor ISSELECT employee_id, last_name FROM employeesWHERE department_id =10;v_empno employees.employee_id%TYPE;v_lname employees.last_name%TYPE;
BEGINOPEN emp_cursor;LOOPFETCH emp_cursor INTO v_empno, v_lname;DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);END LOOP; …
END;

(4)关闭光标

CLOSE语句禁用游标,释放上下文区域,并取消定义活动集。 完成FETCH语句处理后关闭游标。 如果需要,您可以稍后重新打开游标。 把CLOSE想象成关闭和清空盒子,所以你不能再取出它的内容。
...LOOPFETCH emp_cursor INTO v_empno, v_lname;EXIT WHEN emp_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE( v_empno ||' '||v_lname);END LOOP;
CLOSE emp_cursor;  --关闭游标
END;
关闭游标指南
关闭游标时请遵循以下准则:
•光标只有关闭后才能重新打开。 如果您尝试在游标关闭后从游标读取数据,则会引发INVALID_CURSOR异常。

•如果稍后重新打开游标,将重新执行关联的SELECT语句,以使用来自数据库的最新数据重新填充上下文区域。


七、把它放在一起

以下示例声明并处理游标以获取亚洲国家的国家名称和国家法定节假日。
DECLARECURSOR wf_holiday_cursor ISSELECT country_name, national_holiday_dateFROM wf_countries where region_id IN(30,34,35);v_country_name wf_countries.country_name%TYPE;v_holiday wf_countries.national_holiday_date%TYPE;
BEGINOPEN wf_holiday_cursor;LOOPFETCH wf_holiday_cursor INTO v_country_name, v_holiday;EXIT WHEN wf_holiday_cursor%NOTFOUND;DBMS_OUTPUT.PUT_LINE(v_country_name||' '||v_holiday);END LOOP;CLOSE wf_holiday_cursor;
END;



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/329348.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.(转)canal背景与工作原理

【README】 1.canal是一个工具,由阿里开源,用于解析mysql的binlog增量日志,重放日志还原出业务数据,下游可以送入 es,mysql,hbase等; 2.本文以下内容转自:GitHub - alibaba/canal:…

Dapper、Entity Framework 和混合应用

你大概注意到了,自 2008 年以来,我写过许多关于 Entity Framework(即 Microsoft 对象关系映射器 (ORM))的文章,ORM 一直是主要的 .NET 数据访问 API。市面上还有许多其他 .NET ORM,但是有一个特殊类别因其强…

html让时间只展示年月日_如何用html写代码,使得在网页上显示当前的时间和日期...

展开全部在网页62616964757a686964616fe59b9ee7ad9431333363363537中动态的显示日期时间,一般都是使用js来实现,很简单,一看就会。网页中动态的显示系统日期时间function startTime(){var todaynew Date();//定义日期对象var yyyy today.get…

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

一、游标和记录 此示例中的游标基于SELECT语句,该语句仅检索每个表行的两列。 如果它检索了六列或七,八,二十个呢? DECLAREv_emp_id employees.employee_id%TYPE;v_last_name employees.last_name%TYPE;CURSOR emp_cursor ISSEL…

(转 )centos8安装mysql

【1】下载 mysql rpm包 MySQL :: Download MySQL Yum Repositoryhttps://dev.mysql.com/downloads/repo/yum/ 【2】安装mysql 根据官方文档安装,如下: MySQL :: A Quick Guide to Using the MySQL Yum Repositoryhttps://dev.mysql.com/doc/mysql-yu…

IIS负载均衡-Application Request Route详解第一篇: ARR介绍

说到负载均衡,相信大家已经不再陌生了,本系列主要介绍在IIS中可以采用的负载均衡的软件:微软的Application Request Route模块。 其实Application RequestRoute已经有很多文章介绍过了,但是有很多的文档都是英文的,笔者…

单位矩阵的逆矩阵是它本身吗_矩阵运算、单位矩阵与逆矩阵(二)

逆矩阵什么是逆矩阵?数有倒数:逆矩阵也是相同的概念,但我们写为A-1逆矩阵的定义计算逆矩阵我们怎么知道计算结果是正确的?我们把矩阵和逆矩阵相乘来看看:我们为什么需要逆矩阵,举个例子:一帮人坐…

Oracle入门(十四.12)之游标FOR循环

一、游标FOR循环游标FOR循环处理显式游标中的行。 这是一个快捷方式,因为游标被打开,循环中的每次迭代都会获取一次行,当处理最后一行时会退出循环,并且游标会自动关闭。 当最后一行被提取时,循环本身在迭代结束时自动…

结合Jexus + Kestrel 部署 asp.net core 生产环境

ASP.NET Core 是微软的全新的框架。这一框架的目标 ︰ 跨平台针对云应用优化解除 System.Web 的依赖。 获得下面三个方面的优势,你可以把它认为是一个C# 版本的NodeJS: 1) 模块化实现 2) 一切都尽可能的-异步 3) 依赖关…

centos普通用户修改文件权限_用户管理(特殊权限、特殊属性、umask 默认权限 )

特殊权限suidLinux 系统文件除了9位基本权限,还有额外3位特殊权限,分别是  SUID(set uid), -rwsr-xr-x  SGID(set gid), -rw-r-sr-x  SBIT(sticky bit), -rw-r-xr-t  这3位特殊权限不建议使用(除系统默认的特殊权限可…

Oracle入门(十四.13)之带参数的游标

一、带参数的游标参数是一个变量,其名称用于游标声明中。 当游标打开时,参数值被传递给Oracle服务器,Oracle服务器使用它来决定要将哪些行检索到光标的活动集中。这意味着您可以在块中多次打开和关闭显式光标,或者在同一个块的不同…

4.canal抽取失败报is blocked because of many connection errors; unblock with ‘mysqladmin flush-hosts‘

【README】 1.本文po出了报错【messageXXX is blocked because of many connection errors; unblock with mysqladmin flush-hosts】的解决方法; 2.解决方法参考了 StackOverflow: mysql - How to unblock with mysqladmin flush hosts - Stack Overfl…

raid配置ssd为缓存_超融合硬件选配推荐指南 | 第三期:SSD 与 HDD

本期《SMTX OS 硬件选配推荐指南》继续与大家分享单机硬件配置中存储相关的内容——固态硬盘 SSD 和机械硬盘 HDD 章节。前两期摘录了单机硬件配置中的 CPU 选择和内存选择参考,感兴趣的读者可点击回顾。如果希望获取完整《指南》,可点击这里下载。单机硬…

Oracle入门(十四.14)之处理异常

一、什么是异常? 在执行破坏程序正常运行的程序期间发现错误时会发生异常。 有很多可能的例外原因:用户在输入时出现拼写错误; 程序无法正常工作; 广告网页不存在; 等等。 你能想到在使用网站或应用程序时遇到的错误吗?二、PL / SQL中的异常…

1.(译)NoSQL与SQL数据库对比

【README】 1.本文翻译自: NoSQL Vs SQL Databases | MongoDB 2.NoSQL指的是不止sql(not only sql);NoSQL数据库是2000年代末开发的,重点是扩展,快速查询,允许频繁变更,让编程更简…

C#使用Redis集群缓存

本文介绍系统缓存组件,采用NOSQL之Redis作为系统缓存层。 一、背景 系统考虑到高并发的使用场景。对于并发提交场景,通过上一章节介绍的RabbitMQ组件解决。对于系统高并发查询,为了提供性能减少数据库压力,我们加入缓存机制&#…

Oracle入门(十四.15)之捕获Oracle服务器异常

一、异常类型 本课讨论预定义和非预定义的Oracle服务器异常。(1)使用PL / SQL处理异常有两种提出异常的方法: •Oracle服务器隐式(自动):- 发生Oracle错误并自动引发相关异常。- 例如,如果在SEL…

萤石云好友分享的监控怎么看_萤石S1:英超赛场上雄起的中国品牌

北京时间4月26日20:30,英超2014/15赛季第34轮,曼联客场0比3不敌埃弗顿,麦卡锡、斯通斯和米拉拉斯先后进球。曼联在连败的情况下积分榜跌至第四。后弗格森时代的曼联最近刚刚有点起色,似乎这场惨败又让曼联球迷的信心跌到了低谷。在…

2.es与mongodb的区别

【1】es vs mongo 图片转自: MongoDB和Elasticsearch的对比 参考文档: MongoDB和Elasticsearch的对比 10亿数据,数据库选Mongo还是Elalsticsearch?-51CTO.COM ElasticSearch可以替代Mongo么? - 知乎 https://www.j…

taro 缺点_Taro小程序富文本解析4种方法

最近遇到一个富文本解析的问题,尝试了很多办法,终于成功了!最后本人选择Parser。1.Taro组件rich-text优点:使用极其方便,引用一下就行了。缺点:不支持视频,放弃!2.wxParse https://g…