日期:2014-05-16  浏览次数:20543 次

oracle 游标总结

?游标
环境区域是用来处理SQL语句的一个oracle存储区域。游标是指向它的指针或句柄。通过游标,PL/SQL程序可以控制这个环境区域中被处理的语句。
Oracle中的游标有两种:显式游标、隐式游标。
显示游标是用cursor...is命令定义的游标,它可以对查询语句(select)返回的多条记录进行处理,而隐式游标是在执行插入(insert)、删除(delete)、修改(update)和返回单条记录的查询(select)语句时由PL/SQL自动定义的。

1、显式游标操作
显式游标在块定义部分、包或子程序中声明。当声明了显式游标后,可以通过以下三条命令控制显式游标的操作:打开游标、推进游标、关闭游标。
(1)声明显式游标
--例1

Java代码 大的大的
declare   
  v_auths auths%rowtype;   
  v_code auths.author_code%type;   
  cursor c_auths is    
    select * from auths where author_code=v_code;  

declare 
  v_auths auths%rowtype; 
  v_code auths.author_code%type; 
  cursor c_auths is 
    select * from auths where author_code=v_code;

?

上例是将PL/SQL变量绑定在WHERE子句中,下面将游标参数绑定在游标的WHERE子句中:

?

(2)打开显式游标
游标操作的第一步是打开游标。
例1,下面的语句是打开上节例1中声明的显式游标c_auths;?
??--在打开游标前为绑定变量赋值。 ??

?

begin
  --在打开游标前为绑定变量赋值。
  v_code:='A00001';
  --打开游标。
  open c_auths;

?

打开一个已打开的游标也是合法的。当第二次打开游标时,PL/SQL先自动关闭游标,然后再打开。一次打开多个游标也是PL/SQL所允许的

?

(3)推进显式游标
????? 当打开显式游标后,就可以使用FETCH语句来推进游标,返回查询结果集中的一行。每执行完一条FETCH语句后,显式游标会自动指向查询结果集的下一行。

?3.1 fetch方法

begin   
  --打开游标,并初始化结果集   
  open c_salary;   
  loop   
    --推进游标,将游标的查询结果集中的一行存到变量v_salary中。   
    fetch c_salary into v_salary,v_code;   
    --当结果集中没有行时退出循环。   
    exit when c_salary%notfound;   
     end loop;   
  --关闭游标,释放游标占用资源。   
  close c_salary;   

?3.2 for方法 ,可以自动控制游标的打开、推进和关闭

??????

delcare   
  cursor c_salary is   
    select salary form auths where author_code<='A00006';   
begin   

   -- IF  c_salary %ISOPEN = FALSE THEN
     --    OPEN c_salary ; end if;   
    ---ORA-06511: PL/SQL: 游标已经打开
      用FOR时不能添加,否则报错显示游标已经打开,open,close 都不能添加

  --开始游标FOR循环,隐含地打开c_salary游标。   
  for v_salary in c_salary loop   
    --一个隐含的fetch语句在这里被执行。   
   --在循环继续前,一个隐含的c_auths%notfound被检测。   
 end loop;   
  --现在循环已经结束,c_auths游标的一个隐含的close操作被执行。   
  commit;   
end;  

?


(4)关闭显式游标
当整个结果集都检索完以后,应当关闭游标。关闭游标用来通知PL/SQL游标操作已经结束,并且释放游标所占用的资源(结果集所使用的资源空间)。

?

2.显示游标属性

????? 游标有四个属性:%found、%notfound、%isopen和%rowcount。要注意这些属性只能使用在过程性语句中,而不能使用在SQL语句中。

?

3、隐式游标处理
PL/SQL隐式地打开SQL游标,并在它内部处理SQL语句,然后关闭它。SQL游标用来处理insert、update、delete以及返回一行的select...into语句。
?????? 一个SQL游标不管是打开还是关闭,open、fetch和close命令都不能操作它。SQL游标与显式游标类似,也有四个一样的属性。当打开SQL游标之前,SQL游标的属性都为NULL。
???? 隐式游标只使用 SQL%FOUND,SQL%NOTFOUND,SQL%ROWCOUNT三个属性.SQL%FOUND,SQL%NOTFOUND是布尔值,SQL%ROWCOUNT是整数值。

????????

在执行任何DML语句前SQL%FOUND和SQL%NOTFOUND的值都是NULL,在执行DML语句后,SQL%FOUND的属性值将是:

  . TRUE :INSERT

  . TRUE :DELETE和UPDATE,至少有一行被DELETE或UPDATE.

  . TRUE :SELECT INTO至少返回一行

  当SQL%FOUND为TRUE时,SQL%NOTFOUND为FALSE。

  SQL%ROWCOUNT

  在执行任何DML语句之前,SQL%ROWCOUNT的值都是NULL,对于SELECT INTO语句,如果执行成功,SQL%ROWCOUNT的值为1,如果没有成功,SQL%ROWCOUNT的值为0,同时产生一个异常NO_DATA_FOUND.

  SQL%ISOPEN

  SQL%ISOPEN是一个布尔值,如果游标打开,则为TRUE, 如果游标关闭,则为FALSE.对于隐式游标而言SQL%ISOPEN总是FALSE,这是因为隐式游标在DML语句执行时打开,结束时就立即关闭。

?

?5、游标变量

到目前为止前面所有显式游标的例子都是静态游标-即游标与一个SQL语句关联,并且该SQL语句在编译时已经确定。
而游标变量是一个引用类型(REF)的变量。

(1)游标变量的声明
Java代码
declare??
? --使用%rowtype定义一个游标变量类型。??
? type t_authsref is ref cursor return auths%rowtype;??
? --定义一个记录类型。??
? type t_coderecord is record(??
??? author_code article.author_code%type,??
??? article_code article.article_code%type);??
? --声明一个记录类型的变量。??
? v_code t_coderecord;??
? --使用t_coderecord作为一个游标变量类型的结果集类型。??
? type t_coderef is ref cursor return t_codeRecord;??
? --使用v_code作为一个游标变量类型的结果集类型。??
? type t_coderef2 is ref cursor return v_code%type;??
? --使用上面的类型声明的两个游标变量。