`

Oracle_学习开发子程序_游标(显示游标)

阅读更多
    在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视频教程(游标、子程序、包)

    Oracle Package中返回游标的写法和调用

    Oracle Package有简化应用设计、提高应用性能、实现信息隐藏、子程序重载作用。本文举例说明了Oracle Package中返回游标的写法和调用。

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    其三、职业方向多:Oracle数据库管理方向、Oracle开发及系统架构方向、Oracle数据建模数据仓库等方向。 四、 如何学习 认真听课、多思考问题、多动手操作、有问题一定要问、多参与讨论、多帮组同学 五、 体系结构 ...

    oracle学习资料

    §7.5 子程序重载 13 §7.6 删除过程、函数和包 13 §7.7 包的管理 13 第八章 触发器 13 §8.1 触发器类型 13 §8.1.1 DML触发器 13 §8.1.2 替代触发器 13 §8.1.3 系统触发器 13 §8.2 创建触发器 13 §8.2.1 ...

    Oracle 10g 开发与管理

    本文是由笔者2012年学习oracle数据库时编写的学习札记,其中的题目 多数为老师留下的思考题目。 我相信本文会对初学者使用oracle有一个初步的使用印象。右图为我所参 考的书籍。 目录 第一讲 Oacle关系数据库 ...

    Oracle基础学习

    Oracle的学习 1.Oracle 入门 2.SQL 查询和 SQL 函数 3.锁和表分区 4.数据库对象 5.使用 PL/SQL 6.游标管理 7.子程序和程序包 8.触发器和内置程序包 9.备份与恢复简介

    Oracle从基础到熟练(太实用了)

    子程序[proc,udf],自主事务处理和程序包 ①:存储过程 ②:函数 ③:自主事务处理 ④:包规范|包主体 十一.触发器|内置包 ①:触发器类型 ②:触发器原理 ③:new和old 两个行类型变量 ④:递归 ⑤:内置包 十二....

    Oracle11g从入门到精通2

    对于初学者,《Oracle11g从入门到精通》是一本很好的入门教程,对Oracle管理员和应用程序开发员,也有很好的学习和参考价值。  Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以...

    oracle总结oracle总结面试必备

    自己总结的oracle的一些sql 从创建表开始 一直到游标、触发器、存储过程、子程序、包、函数等!

    plsql_oracle 编程

    §7.5 子程序重载 13 §7.6 删除过程、函数和包 13 §7.7 包的管理 13 第八章 触发器 13 §8.1 触发器类型 13 §8.1.1 DML触发器 13 §8.1.2 替代触发器 13 §8.1.3 系统触发器 13 §8.2 创建触发器 13 §8.2.1 ...

    Oracle包应用详解.doc

    (1)包是一种数据库对象,将逻辑上相关的PL/SQL类型、对象和子程序组合成一个更大的单位,是一组相关过程、函数、变量、常量和游标等PL/SQL程序设计元素的组合,它具有面向对象程序设计语言的特点,是对这些PL/SQL ...

    ORACLE PL/SQL 存储过程 触发器

    ORACLE PL/SQL 存储过程 触发器 ORACLE PL/SQL 存储过程 触发器 子程序 游标

    学生成绩管理系统Oracle全部SQL语句.txt

    选定某一主题,运用oracle数据库,以及相关技术方法设计和开发一个信息管理的数据库系统,实现数据库的开发应用以及日常管理维护等基本功能。 具体要求如下: (1)选定某一主题,创建一个oracle数据库,对其进行...

    Oracle9i的init.ora参数中文说明

    Oracle9i初始化参数中文说明 Blank_trimming: 说明: 如果值为TRUE, 即使源长度比目标长度 (SQL92 兼容) 更长, 也允许分配数据。 值范围: TRUE | FALSE 默认值: FALSE serializable: 说明: 确定查询是否获取表级...

    Oracle帮助文档

    Oracle帮助文档 ... 子程序/过程(procedure) 子程序/函数 事务处理 触发器 包 范式 数据备份(exp)与恢复(imp) 归档方式 过程练习题 考试题_查询部分 考试题_查询部分(2) 考试题_pl/sql 习题_触发器

    Oracle11g从入门到精通

    对于初学者,《Oracle11g从入门到精通》是一本很好的入门教程,对Oracle管理员和应用程序开发员,也有很好的学习和参考价值。  Oracle数据库系统是数据库领域最优秀的数据库之一,《Oracle11g从入门到精通》以...

    PL/SQL 基础.doc

    子程序: 5. 分界符 1) 运算符 + - * / **(指数操作符) 2) 关系 =(相当于JAVA中的==) > < <> != ~= ^= <= >= 3) 赋值 := 例子a:=2 4) 连接 || 例: 'abc' || 123 5) 标号 需要的标记 >> 6) 注释 --(单行)...

    精通Oracle.10g.PLSQL编程

    通过学习本书,读者不仅可以掌握PL/SQL的基础编程知识(嵌入SQL语句和编写子程序),而且还可以掌握PL/SQL的所有高级开发特征(使用记录类型、集合类型、对象类型和大对象类型)。另外,本书还为应用开发人员提供了...

    Oracle PLSQL程序设计

    培训资料,包括PL/SQL概述、数据类型、控制类型、异常处理、游标、子程序及包、触发器、内置包、集合与数组

Global site tag (gtag.js) - Google Analytics