在oracle9i之前,为了查询处理select语句返回的多行数据,开发人员必须要使用显示游标,在oracle9i开始,开发人员即可以使用显示游标处理多行数据,也可以使用select ...bulk collect into 语句处理多行数据。
一、显示游标
PL/SQL包含隐藏游标和显示游标等两种游标类型,其中隐藏游标用于处理select into和DML语句,而显示游标用于专门处理select语句返回多行数据。
1、使用显示游标
为了处理select语法返回的多行数据,开发人员可以使用显示数据,使用显示数据包括定义游标、打开游标、提取游标、和关闭游标四个阶段:
(1)、定义游标:
在使用显示游标之前,必须首先在定义部分定义游标,定义游标用于指定游标所对应的select语句,语法如下:
cursor cursor_name is select_statement;
如上所示,cursor_name用于指定游标的名称,select_statement用于指定游标所对应的select语句,
(2)打开游标:
当打开游标时,oracle会执行游标所对应的select语句,并且将select语句的结果暂时保持到结果集中,语法如下;
open cursor_name;
该游标名称必须在定义部分定义成游标。
(3)、提出数据
在游标打开之后,select语句返回的结果集临时保持到游标结果集中,为了处理结果集的数据,需要使用fetch语句提取游标数据,在oracle9i之前,使用fetch语句每次只能提取一行数据,从oracle9i开始,通过使用fetch..bulk collect into语句,每次可以提取多行数据,语法如下:
语法一:fetch cursor_name into variable1,variable2,....;
语法二:fetch cursor_name bulk collect into collect1,collect2,..[limit rows];
如上所示:variable用于指定接收游标数据的变量;collect用于指定接收游标结果的集合变量, 注意,当使用语法一时,必须要使用循环语句处理结果集的所有数据。
(4)、关闭游标
在提取并处理结果集的所有数据之后,就可以关闭游标并释放器结果集了,语法如下:
close cursor_name;
2、显示游标属性
显示游标属性用于返回显示游标的执行信息,这些属性包括%isopen,%found,%notfond和%rowcount,当使用游标时,必须要在显示游标属性之前带有显示游标名作为前缀(游标名属性名)。
(1)、%isopen
该属性用于确定游标是否打开,如果游标已经打开,则返回值为true,如果游标没有打开,则返回值为false,示例如下:
if cl%isopen then ----如果游标打开,则执行相应操作。
......
else -----如果游标未打开,则打开游标
open cl;
end if;
(2)、%found
该属性用于检查是否从结果集中提取到了数据,如果提取到了数据,则返回值为true,如果未提取到数据,则返回值为false,示例如下:
loop
fetch cl into var1,var2,; -------提取数据到变量中
if cl%found then -----------如果提取到数据,则进行相应操作
......;
else ---------如果没有提取到数据,则退出循环
exit;
end if;
end loop;
(3)、%notfound
该属性与%found属性恰好相反,如果提到数据,则返回false,如果没有提取到数据,则返回true。示例如下:
loop
fetch cl into var1,var2;
if cl%notfound then
。。。。。。。。;
else
exit;
end if;
end loop;
(4)、%rowcount
该属性用于返回到当前行为止,已经提取到得实际行数,示例如下:
loop
fetch cl into var1,var2;
if cl%rowcount>0 then
......
end if;
end loop;
3、显示游标示例
(1)、在显示游标时使用fetch...into语句
在oracle9i之前使用fetch..into语句,每次只能处理一行数据,为了处理结果集中的多行数据,必须要使用循环语句进行处理,示例如下:
declare
cursor cursor_temp IS select name,age,address,id from cip_temps where id=10;
v_name cip_temps.name%TYPE;
v_age cip_temps.age%TYPE;
v_address cip_temps.address%TYPE;
v_id cip_temps.id%TYPE;
begin
open cursor_temp;
loop
fetch cursor_temp into v_name,v_age,v_address,v_id;
exit when cursor_temp%notfound;
dbms_output.put_line(v_name ||':'|| v_age ||':'|| v_address||':'|| v_id);
end loop;
close cursor_temp;
end;
(2)、在显示游标中,使用fetch..bulk collect into 语句提取所有数据
从oracle9i开始,通过使用fetch..bulk collect into 语句,一次就可以提取结果集的所有数据,示例如下:
declare
cursor temp_cursor is select * from cip_temps where id=1;
type temp_table_type is table of cip_temps%rowtype;
temp_table temp_table_type;
begin
open temp_cursor;
fetch temp_cursor bulk collect into temp_table;
for i in 1..temp_table.count loop
dbms_output.put_line(temp_table(i).name||':'||temp_table(i).age||':'||temp_table(i).address||':'||temp_table(i).id);
end loop;
close temp_cursor;
end;
(3)、在显示游标中,使用fetch..bulk collect into..limit 语句提取部分数据
当使用fetch..bulk collect into子句提取数据时,默认情况下会提取结果集中的全部数据,如果结果集的数据含有大量数据,并且使用array集合变量接收数据,那么可能需要限制每次提取的行数,示例如下:
declare
type temp_array_type is array(5) of cip_temps%rowtype;
temp_array temp_array_type;
cursor temp_cursor is select * from cip_temps;
rows int:=5;
v_count int:=0;
begin
open temp_cursor;
loop
fetch temp_cursor bulk collect into temp_array limit rows;
dbms_output.put_line('message:');
for i in 1..(temp_cursor%rowcount-v_count) loop
dbms_output.put_line(temp_array(i).name||':'||temp_array(i).age||':'||temp_array(i).address||':'||temp_array(i).id);
end loop;
v_count:=temp_cursor%rowcount;
exit when temp_cursor%notfound;
end loop;
close temp_cursor;
end;
(4)、使用游标属性
为了显示游标的执行信息,需要使用显示游标的属性,下面以显示游标属性%isopen和%rowcount为例:
declare
type name_table_type is table of cip_temps.name%type index by binary_integer;
name_table name_table_type;
cursor temp_cursor is select name from cip_temps;
begin
if not temp_cursor%isopen then
open temp_cursor;
end if;
fetch temp_cursor bulk collect into name_table;
dbms_output.put_line(temp_cursor%rowcount);
close temp_cursor;
end;
分享到:
相关推荐
oracle视频教程(游标、子程序、包) oracle视频教程(游标、子程序、包)
总的来说,《Oracle_database_11g_SQL开发指南》是一本全面且实用的教程,无论你是刚接触Oracle的新手,还是希望通过学习深化数据库知识的专业人士,都能从中受益。配合提供的PDF文档,你可以随时随地学习和查阅,...
在Oracle数据库环境中,PL/SQL被广泛用于开发存储过程、函数、触发器、游标和包,以实现复杂的业务逻辑和数据处理任务。本文将深入探讨Oracle PL/SQL的相关知识点,并结合Java进行集成开发。 1. **PL/SQL基础** - ...
9. **子程序和包**:存储过程和函数是可重用的代码单元,用于执行特定任务。包是包含相关过程、函数和变量的集合,提供模块化和封装。 10. **游标变量和记录类型**:游标变量用于存储游标的当前状态,而记录类型...
Oracle 游标是 PL/SQL 程序中的一种重要组件,用于处理查询结果集。游标可以分为隐式游标和显式游标两种,隐式游标由 PL/SQL 管理,隐式游标打开时查询开始,查询结束时隐式游标自动关闭。显式游标需要在 PL/SQL 块...
Oracle PL/SQL 讲义第 23 章 使用子程序和包 本章要点: * 掌握存储子程序与数据字典的交互方式及如何从 SQL 语句中调用存储子程序 * 了解存储子程序和局部子程序的区别 * 掌握存储子程序在 Oracle8i 和 Oracle9i ...
5. **子程序**:包括过程(PROCEDURE)和函数(FUNCTION),它们可以封装代码并多次调用,提高代码复用性。函数可返回一个值,而过程不返回。 6. **游标**:游标用于处理SQL查询结果集,允许逐行操作数据,常用于...
通过深入学习和实践上述知识点,你可以有效地使用Oracle PL/SQL进行数据库管理和应用开发。参考提供的"Oracle,PL-SQL.pdf"文档,结合"www.pudn.com.txt"中可能包含的资源,将有助于你更全面地理解Oracle PL/SQL的...
1. Oracle SQL基础:Oracle SQL遵循SQL标准,但增加了许多自己的扩展特性,如子查询、连接查询、集合操作、游标、触发器等。在学习Oracle SQL时,你需要理解如何创建表、视图、索引,以及如何插入、更新和删除数据。...
描述中提到“Oracle,PL/SQL操作手册,主要介绍语法等”,意味着这份资料可能详尽地涵盖了PLSQL的基本语法、数据类型、变量声明、控制结构(如IF-THEN-ELSE、CASE语句)、循环(WHILE、FOR循环)、子程序(过程和函数...
### ORACLE_PlSql-甲骨文学习笔记 #### 一、创建表 ##### 创建表一 ```sql CREATE TABLE TABLE_NAME ( AAA INTEGER CONSTRAINT PK_TABLE_NAME PRIMARY KEY, BBB VARCHAR2(10) NOT NULL, DOB DATE, CCC VARCHAR...
Oracle PL/SQL是一种强大的编程语言,它...学习PL/SQL对于开发Oracle数据库应用程序、维护数据库逻辑和优化性能至关重要。通过阅读Oracle2BPL-SQL.pdf,初学者可以逐步掌握这一强大工具,提升数据库管理和开发的能力。
### ORACLE_PLSQL学习总结(提高) #### 一、PL/SQL 块中的操作限制 在PL/SQL块中可以执行的操作主要包括:SELECT、DML(如INSERT、UPDATE、DELETE)以及事务控制语句(如COMMIT、ROLLBACK、SAVEPOINT)。然而,...
3. **子查询**:Oracle SQL中的子查询允许在查询中嵌套查询,用于比较、筛选或者组合复杂的数据。 4. **联接操作**:Oracle支持多种类型的联接,包括内连接(INNER JOIN)、外连接(LEFT JOIN, RIGHT JOIN, FULL JOIN)...
- **SQL语言**:Oracle支持标准SQL,包括数据查询、数据更新、数据插入和删除操作,以及更复杂的子查询、连接查询、聚合函数和窗口函数等。 - **数据库管理**:包括数据库的创建、启动、关闭、备份和恢复,以及表...
`UPDATE_XML_OUTPUT_FORMAT`子程序修改了并发请求的参数,将输出格式设置为RTF。这可能是在准备XML输出时的预处理步骤,确保后续的XML生成符合预期的格式。 2. **数据准备**: 在`XML_PRINT`过程中,首先打开一个...
4. **子程序设计**:学习如何创建和调用过程、函数,以及参数传递。 5. **性能优化**:掌握如何编写高效的PL/SQL代码,避免全表扫描和减少资源消耗。 “Oracle PLSQL Programming.chm”这个文件很可能是对这些内容...
"OracleTest"作为子文件名,很可能是一个实现以上功能的测试脚本或应用程序。它可能包含了设置连接参数、执行SQL语句、异常处理、性能评估等逻辑。对这个程序的深入理解和调试,有助于确保与Oracle数据库的交互是...
游标是Oracle数据库中的一种重要机制,它允许程序逐行处理查询结果集。游标本质上是一个可以从包含多条记录的结果集中每次提取一条记录的工具。当SQL SELECT语句返回的记录超过一条时,游标就显得非常有用。它能够将...
**PL/SQL全称是Procedural Language/Structured Query Language,是Oracle数据库提供的一种过程化SQL语言,它结合了SQL的查询能力与编程...通过深入学习和实践,你可以有效地提升在Oracle数据库管理与开发方面的能力。