PL/SQL 第9章 使用游标

来源:互联网 发布:武林外传排名知乎 编辑:程序博客网 时间:2024/04/30 03:14

2012-5-27

9.1显示游标

当在PL/SQL块中执行查询语句(select)和数据操作语句(DML)时,Oracle会为其分配上下文区,游标是指向上下文区的指针。对于数据操纵语句和单行select into语句来说,Oracle会为它们分配隐含游标。为了处理select语句返回的多行数据,开发人员必须使用显示游标,也可以使用select..bulk collect into语句处理。

1.使用显示游标
  包括定义游标、打开游标、提取数据和关闭游标四个阶段

(1)定义游标(用于指定游标所对应的select语句)
   语法如下:cursor cursor_name is select_statement;
   如上所示,cursor_name 用于指定的游标名称;select_statement用于指定游标所对应的select语句。

(2)打开游标 语法:open cursor_name
(3)提取数据 

   语法一: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,%notfound和%rowcount属性)
 
  使用显示游标属性的方法:游标名.属性名

  (1)%isopen用于确定游标是否已经打开。
  (2)%found用于检查是否从结果集中提取到了数据。
  (3)%notfound 与(2)相反
  (4)%rowcount 返回当前行为为止已提取到实际行数。示例如下
     LOOP
     fetch c1 into my_ename,my_deptno;
     if c1%rowcount>10 then
     ...
     end if;
     ...
     end loop;

示例一:在显示游标中使用fetch...into语句
示例二 :基于游标定义记录变量
         当基于游标定义记录变量时,记录成员名实际就是select语句的列名或列别名。

9.2参数游标
   参数游标是指带有参数的游标。在定义了参数游标之后,当使用不同参数值多次打开游标时,可以生成不同的结果集。
   语法:cursor cursor_name (parameter_name datatype) is select_satement;
   注意:定义参数游标时,游标参数只能指定数据类型,而不能指定长度。另外,定义参数游标时,一定要在游标子查询的where子句中引用该参数,否则失去了定义参数游标的意义。
 
9.3使用游标更新或删除数据

   如果要通过游标更新或删除数据,在定义游标时必须要带有for update子句,语法如下:
   cursor cursor_name (parameter_name dataype) is select_statement for update (of column_reference)[nowait];
如上所示,for update子句用于在游标结果集数据上加行共享锁,以防止其他用户在相应行执行DML操作;
of 指定那些表要加锁
nowait 指定不等待锁

在提取了游标数据之后,为了更新或删除当前游标行数据,必须在update或delete语句中引用where current of 子句
语法如下;

update 表名 set 列名=...where current of cursor_name
delete 表名 where current of cursor_name

9.4游标for循环

    游标for循环是在PL/SQL块中使用游标最简单的方式,简化了对游标的处理。当使用游标for循环时,Oracle会隐含地打开游标、提取游标数据并关闭游标。使用游标FOR循环的语法如下:
    for record_name in cursor_name loop
        statement1;
        statement2;
    end loop;
   如上所示,cursor_name是定义的游标名;record_name是Oracle隐含定义的记录变量名。每循环一次提取一次数据。

1.使用游标for循环
2.在游标for循环中直接使用子查询

9.5使用游标变量
   PL/SQL的游标变量中存放着指向内存地址的指针。当使用显示游标时,需要在定义部分指定其所对应的select语句;当使用游标变量时,开发人员可以在打开游标变量时指定其所对应的select语句。

1.游标变量使用步骤

  在PL/SQL块中使用游标变量包括定义游标变量、打开游标、提取游标数据、关闭游标等四个阶段。具体步骤如下:
  (1)定义REF cursor类型和游标变量
     为了在PL/SQL块中定义游标变量,必须首先定义ref cursor类型,然后才能定义游标变量。语法:
     type ref_type_name is ref cursor [return return_type];
     cursor_varialble ref_type_name;
     如上所示,ref_type_name用于指定自定义类型,return子句时,其数据类型必须是记录类型。
  (2)打开游标
     语法:open cursor_varialble for select_statement;
  (3)提取游标数据
  (4)关闭游标数据

9.6使用cursor表达式

 

 

 

 


   

 

 

 

 

 

 

 

 


 

 

原创粉丝点击