使用游标
当在pl/sql块中执行查询语句(select)和数据操纵语句时,Oracle会为其分配上下文区,游标是指向上下文区的指针。
pl/sql包含隐含游标和显示游标等两种游标类型,其中隐含游标用于处理select into和DML语句,而显示游标专门用于处理select
语句返回的多行数据。
1.使用显示游标
显示游标包括定义游标、打开游标、提取数据和关闭游标四个阶段
declare open fetch close
(1) 定义游标
语法如下: CURSOR cursor_name IS select_statement;
cursor_name 用于指定的游标名称。
select_statement 用于指定游标所对应的select语句。
(2) 打开游标---当打开游标时,Oracle会执行游标所对应的select语句,并且将select语句的结果暂时存放在结果集中。
语法如下: OPEN cursor_name; 游标名必须是在定义部分已经被定义的游标。
(3) 提取数据---使用fetch语句提取游标数据
2种方式: 语法一 FETCH cursor_name INTO variable1,variable2,......;
语法二 FETCH cursor_name BULK COLLECT INTO collect1,collect2,.........
variable1 用于指定接收游标数据的变量,collect用于指定接收游标结果的集合变量。注意当使用
语法一时,必须要使用循环语句处理结果集的所有数据。
(4) 关闭游标---在提取并处理了结果集的所有数据之后,就可以关闭游标并释放其结果集了。
语法如下: CLOSE cursor_name;
2.显示游标属性---用于返回显式游标的执行信息
语法: 游标名+游标属性 c1%ISOPEN
(1) %ISOPEN 用于判断游标是否打开。
(2) %FOUND 该属性用于检查是否从结果集中提取到了数据。
eg: LOOP
FETCH c1 INTO var1,var2;
IF c1%FOUND THEN
.......
ELSE
EXIT;
END IF
END LOOP;
(3) %NOTFOUND
(4) %ROWCOUNT ---用于返回到当前行为止已经提取到的实际行数。
LOOP
FETCH c1 INTO my_ename,my_deptno;
IF c1%ROWCOUNT >10 then
.......
END IF;
END LOOP;
===========================================================================================
列出部门编号是10的员工姓名。
declare
CURSOR c1 IS select ename from emp where emp.deptno=10;
var_ename varchar2(50);
begin
open c1;
Loop
FETCH c1 INTO var_ename;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line(var_ename);
end loop;
end;
用 fetch bulk collect into 的写法;
declare
CURSOR ename_cursor IS select ename from emp where emp.deptno=10;
TYPE ename_table_type IS TABLE OF varchar(50)『此处不能用%type』;
ename_type ename_table_type;
begin
open ename_cursor;
fetch ename_cursor bulk collect into ename_type;
for i in 1..ename_type.count LOOP
dbms_output.put_line(ename_type(i));
END LOOP;
CLOSE ename_cursor;
end;
============================================================================================================================
当使用fetch...bulk collect into 语句提取数据时,默认情况下会提取结果集的所有数据.如果结果集
含有大量数据,并且使用varray集合变量接收数据,那么可能需要限制每次提取的行数。
下面以每次提取5行数据为例,说明使用limit子句限制提取行的方法:
declare
type name_array_type is varray(5) of varchar2(10);
name_array name_array_type;
CURSOR emp_cursor IS select ename from emp;
rows int:=5;
v_count int:=0;
begin
open emp_cursor;
loop
fetch emp_cursor bulk collect into name_array limit rows;
dbms_output.put_line('emp_cursor%rowcount='|| emp_cursor%rowcount);
dbms_output.put_line('v_count='|| v_count);
dbms_output.put_line('雇员名:');
for i in 1..(emp_cursor%rowcount-v_count) Loop
dbms_output.put_line(name_array(i)||' ');
end Loop;
dbms_output.new_line;
v_count:=emp_cursor%rowcount;
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;
当在pl/sql块中执行查询语句(select)和数据操纵语句时,Oracle会为其分配上下文区,游标是指向上下文区的指针。
pl/sql包含隐含游标和显示游标等两种游标类型,其中隐含游标用于处理select into和DML语句,而显示游标专门用于处理select
语句返回的多行数据。
1.使用显示游标
显示游标包括定义游标、打开游标、提取数据和关闭游标四个阶段
declare open fetch close
(1) 定义游标
语法如下: CURSOR cursor_name IS select_statement;
cursor_name 用于指定的游标名称。
select_statement 用于指定游标所对应的select语句。
(2) 打开游标---当打开游标时,Oracle会执行游标所对应的select语句,并且将select语句的结果暂时存放在结果集中。
语法如下: OPEN cursor_name; 游标名必须是在定义部分已经被定义的游标。
(3) 提取数据---使用fetch语句提取游标数据
2种方式: 语法一 FETCH cursor_name INTO variable1,variable2,......;
语法二 FETCH cursor_name BULK COLLECT INTO collect1,collect2,.........
variable1 用于指定接收游标数据的变量,collect用于指定接收游标结果的集合变量。注意当使用
语法一时,必须要使用循环语句处理结果集的所有数据。
(4) 关闭游标---在提取并处理了结果集的所有数据之后,就可以关闭游标并释放其结果集了。
语法如下: CLOSE cursor_name;
2.显示游标属性---用于返回显式游标的执行信息
语法: 游标名+游标属性 c1%ISOPEN
(1) %ISOPEN 用于判断游标是否打开。
(2) %FOUND 该属性用于检查是否从结果集中提取到了数据。
eg: LOOP
FETCH c1 INTO var1,var2;
IF c1%FOUND THEN
.......
ELSE
EXIT;
END IF
END LOOP;
(3) %NOTFOUND
(4) %ROWCOUNT ---用于返回到当前行为止已经提取到的实际行数。
LOOP
FETCH c1 INTO my_ename,my_deptno;
IF c1%ROWCOUNT >10 then
.......
END IF;
END LOOP;
===========================================================================================
列出部门编号是10的员工姓名。
declare
CURSOR c1 IS select ename from emp where emp.deptno=10;
var_ename varchar2(50);
begin
open c1;
Loop
FETCH c1 INTO var_ename;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line(var_ename);
end loop;
end;
用 fetch bulk collect into 的写法;
declare
CURSOR ename_cursor IS select ename from emp where emp.deptno=10;
TYPE ename_table_type IS TABLE OF varchar(50)『此处不能用%type』;
ename_type ename_table_type;
begin
open ename_cursor;
fetch ename_cursor bulk collect into ename_type;
for i in 1..ename_type.count LOOP
dbms_output.put_line(ename_type(i));
END LOOP;
CLOSE ename_cursor;
end;
============================================================================================================================
当使用fetch...bulk collect into 语句提取数据时,默认情况下会提取结果集的所有数据.如果结果集
含有大量数据,并且使用varray集合变量接收数据,那么可能需要限制每次提取的行数。
下面以每次提取5行数据为例,说明使用limit子句限制提取行的方法:
declare
type name_array_type is varray(5) of varchar2(10);
name_array name_array_type;
CURSOR emp_cursor IS select ename from emp;
rows int:=5;
v_count int:=0;
begin
open emp_cursor;
loop
fetch emp_cursor bulk collect into name_array limit rows;
dbms_output.put_line('emp_cursor%rowcount='|| emp_cursor%rowcount);
dbms_output.put_line('v_count='|| v_count);
dbms_output.put_line('雇员名:');
for i in 1..(emp_cursor%rowcount-v_count) Loop
dbms_output.put_line(name_array(i)||' ');
end Loop;
dbms_output.new_line;
v_count:=emp_cursor%rowcount;
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;
发表评论
-
Oracle特别函数---First_Value
2009-11-10 14:09 1869FIRST_VALUE 功能描述:返回组中数据窗口的第一个值。 ... -
oracle定时删除表空间的数据并释放表空间
2009-10-13 16:53 2644这两天我一个朋友问我 ... -
oracle定时任务(dbms_job)
2009-10-13 16:50 2317今天总结下oracle的任务队列管理器(job queue ) ... -
Decode函数的语法
2009-10-13 16:47 1030Decode函数的语法结构如下: decode (expre ... -
Oracle 中truncate与delete的区别
2009-10-13 16:27 1040Oracle 中truncate与delete的区别 收藏 ... -
数据库---存储过程总结
2009-10-13 16:20 964定义: ... -
oracle执行计划的理解
2009-10-13 16:12 754执行计划的理解 计信息 ------------------ ... -
oracle定时添加或删除分区表的分区
2009-10-13 16:11 2095这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里 ... -
Oracle常用数据字典表
2009-09-16 09:00 1122查看当前用户的缺省表空间 SQL>select us ... -
关于SQL中的“\”的转义
2009-05-30 08:23 973select ename from myemp where e ... -
Oracle存储过程学习(2)
2009-05-11 08:05 1171存储过程创建语法: create or rep ... -
ora-12154 TNS:"无法处理服务名"的一个解决方法
2009-04-13 15:48 1463很怪异的一个问题,在网络环境下配置客户端,竟然怎么也连不上主机 ... -
触发器
2009-02-10 20:27 1031触发器 触发器是指被隐含执行的存储过程,当发生特定事件(例如修 ... -
Oracle 包
2009-02-06 20:08 1241包 包用于逻辑组合相关的PL/SQL类型、项、子程序,它由包 ... -
函数的纯度级别以及使用
2009-02-05 16:09 962函数的纯度级别以及使用 - 定义由函数读取或修改的数据种类。 ... -
管理存储过程和函数
2009-02-05 10:47 755管理存储过程和函数 1.列出当前用户的子程序 SQL>c ... -
Oracle 自定义函数
2009-02-04 14:49 3635函数 函数用于返回特定数据。执行时得找一个变量接收函数的返回值 ... -
Oracle存储过程
2009-02-04 11:05 1056Oracle存储过程 存储过程不仅可以简化客户端应用程序的开发 ... -
PL/SQL DEVELOPER 基本用法详解
2009-02-03 10:37 2389一.编辑表数据(浏览表 ... -
游标(二)
2009-02-02 16:14 843游标FOR循环 游标FOR循环是游标使用的最简单的方式,当使用 ...
相关推荐
3 Android SqliteManager 源码.zip
内容概要:本文详细介绍了基于S7-200 PLC的煤矿排水系统智能控制方案,重点讨论了三台水泵(两台工作水泵和一台备用水泵)的联动与备援策略。系统通过超声波液位传感器实时监测水位,根据不同水位情况自动控制水泵的启停。具体而言,水位低时不启动水泵,水位介于中水位和高水位之间时启动1号水泵,水位超过高水位则启动1号和2号水泵共同工作。若1号或2号水泵出现故障,系统会自动启用3号备用水泵。此外,MCGS6.2组态画面用于实时监控水位和水泵状态,帮助操作员及时应对异常情况,确保矿井安全。 适合人群:从事煤矿自动化控制领域的技术人员、矿业工程管理人员及相关研究人员。 使用场景及目标:适用于需要提高煤矿排水系统自动化水平的场合,旨在提升矿井排水效率和安全性,减少人工干预,确保矿井生产安全。 其他说明:文中提到的技术方案不仅提高了排水系统的可靠性,还为未来的智能化矿山建设提供了有益借鉴。
scratch少儿编程逻辑思维游戏源码-灌篮之王.zip
scratch少儿编程逻辑思维游戏源码-飞翔马里奥(2).zip
scratch少儿编程逻辑思维游戏源码-火柴人大战 中世纪战争.zip
scratch少儿编程逻辑思维游戏源码-几何冲刺(2).zip
南京证券-低轨卫星互联网启动,天地一体通信迈向6G
nginx-1.20.1
sshpass-1.06-8.ky10.aarch
少儿编程scratch项目源代码文件案例素材-我的世界2D(更新北极).zip
通信行业专题研究:车载全息数字人——AI+Agent新场景,全息投影新方向-20231121-国盛证券-13页
内容概要:本文详细介绍了利用西门子S7-200 PLC和组态王软件构建的邮件分拣系统的具体设计方案和技术细节。首先,文中阐述了硬件部分的设计,包括光电传感器、传送带电机以及分拣机械臂的连接方式,特别是旋转编码器用于精确测量包裹位移的技术要点。接着,展示了PLC编程中的关键代码段,如初始化分拣计数器、读取编码器数据并进行位置跟踪等。然后,描述了组态王作为上位机软件的作用,它不仅提供了直观的人机交互界面,还允许通过简单的下拉菜单选择不同的分拣规则(按省份、按重量或加急件)。此外,针对可能出现的通信问题提出了有效的解决方案,比如采用心跳包机制确保稳定的数据传输,并解决了因电磁干扰导致的问题。最后,分享了一些现场调试的经验教训,例如为减少编码器安装误差对分拣精度的影响而引入的位移补偿算法。 适合人群:从事自动化控制领域的工程师或者对此感兴趣的初学者。 使用场景及目标:适用于需要提高邮件或其他物品自动分拣效率的企业或机构,旨在降低人工成本、提升工作效率和准确性。 其他说明:文中提到的实际案例表明,经过优化后的系统能够显著改善分拣性能,将分拣错误率大幅降至0.3%,并且日均处理量可达2万件包裹。
scratch少儿编程逻辑思维游戏源码-机械汽车.zip
内容概要:本文详细探讨了在连续介质中利用束缚态驱动设计并实现具有最大和可调谐手征光学响应的平面手征超表面的方法。文中首先介绍了comsol三次谐波和本征手性BIC(束缚态诱导的透明)两种重要光学现象,随后阐述了具体的手征超表面结构设计,包括远场偏振图、手性透射曲线、二维能带图、Q因子图和电场图的分析。最后,通过大子刊nc复现实验验证了设计方案的有效性,并对未来的研究方向进行了展望。 适合人群:从事光学研究的专业人士、高校物理系师生、对光与物质相互作用感兴趣的科研工作者。 使用场景及目标:适用于希望深入了解手征超表面设计原理及其光学响应机制的研究人员,旨在推动新型光学器件的研发和技术进步。 其他说明:本文不仅展示了理论分析和模拟计算,还通过实验证明了设计方法的可行性,为后续研究奠定了坚实的基础。
少儿编程scratch项目源代码文件案例素材-位图冒险.zip
少儿编程scratch项目源代码文件案例素材-校园困境2.zip
少儿编程scratch项目源代码文件案例素材-兔子吃萝卜.zip
scratch少儿编程逻辑思维游戏源码-海洋战争.zip
房地产 -前策标准化-沪浙一部.pptx
scratch少儿编程逻辑思维游戏源码-克里斯历险记3.zip