`

Oracle游标

    博客分类:
  • DB
阅读更多

一、游标

      游标-----内存中的一块区域,存放的是select 的结果。    

      游标用来处理从数据库中检索的多行记录(使用SELECT语句)。利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集。

二、游标类别

     游标包括显式游标和隐式游标。

1、显式游标

      显示游标被用于处理返回多行数据的SELECT 语句,游标名通过CURSOR….IS 语句显示地赋给SELECT 语句。

       在PL/SQL中处理显示游标所必需的四个步骤:

       1)声明游标;CURSOR cursor_name IS select_statement

       2)为查询打开游标;OPEN cursor_name

       3)取得结果放入PL/SQL变量中;

              FETCH cursor_name INTO list_of_variables;

              FETCH cursor_name INTO PL/SQL_record;

       4)关闭游标。CLOSE cursor_name

       注意:在声明游标时,select_statement不能包含INTO子句。当使用显示游标时,INTO子句是FETCH语句的一部分。

2、隐式游标

           在 PL/SQL 程序中执行DML SQL 语句时自动创建隐式游标,名字固定叫sql。

  在PL/SQL中使用DML语句时自动创建隐式游标 

  隐式游标自动声明、打开和关闭,其名为 SQL 

  通过检查隐式游标的属性可以获得最近执行的DML 语句的信息 

  隐式游标的属性有: 

                %FOUND – SQL 语句影响了一行或多行时为 TRUE 

%NOTFOUND – SQL 语句没有影响任何行时为TRUE 

%ROWCOUNT – SQL 语句影响的行数 

%ISOPEN - 游标是否打开,始终为FALSE

三、游标属性

Oracle 游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。

  %ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;

  %FOUND %NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;

  %ROWCOUNT返回当前位置为止游标读取的记录行数。

 

 

--游标声明 cursor  cursor_name is select_statement
-------------------------------------------------------------------------------------------
--For 循环游标
--(1)定义游标
--(2)定义游标变量
--(3)使用for循环来使用这个游标
declare
    cursor c_user
    is
    select * from tuser order by id asc;
    --定义一个游标变量v_row c_user%ROWTYPE ,该类型为游标c_user中的一行数据类型
    c_row c_user%rowtype;
begin
    for c_row in c_user loop
      dbms_output.put_line(c_row.id||'  name  '||c_row.name);
     end loop;
end;


-----------------------------------------------------------------------------------------------
--Fetch游标
--使用的时候必须要明确的打开和关闭
declare
    cursor c_user
    is 
    select * from tuser order by id asc;
    c_row c_user%rowtype;
begin
    open c_user;
    loop
    --提取一行数据到c_row
    fetch c_user into c_row;
    --判读是否提取到值,没取到值就退出
    --取到值c_job%notfound 是false 
    --取不到值c_job%notfound 是true
    exit when c_user%notfound;
    dbms_output.put_line(c_row.id||'  name  '||c_row.name);
    end loop;
    close c_user;
end;


--------------------------------------------------------------------------------------
--参数游标(for方式)
declare
   cursor c_role(p_roleid varchar2)
   is
   select u.id id,u.name name,u.address address,r.roleid roleid,r.name rolename from tuser u,trole r where u.roleid=r.roleid and r.roleid=p_roleid;
   --必须定义别名
   c_row c_role%rowtype;
begin
   for c_row in c_role('1') loop
     dbms_output.put_line(c_role%rowcount||'  '||c_row.id||' '||c_row.rolename);
   end loop;
 
end;

---------------------------------------------------------------------------------------
--参数游标(fetch方式)
declare
   cursor c_role(p_roleid varchar2)
   is
   select u.id id,u.name name,u.address address,r.roleid roleid,r.name rolename from tuser u,trole r where u.roleid=r.roleid and r.roleid=p_roleid;
   --必须定义别名
   c_row c_role%rowtype;
begin
   open c_role('1');
   loop
   fetch c_role into c_row;
     exit when c_role%notfound;
     dbms_output.put_line(c_role%rowcount||'  '||c_row.id||' '||c_row.rolename);
   end loop;
   close c_role;
end;

----------------------------------------------------------------------------------------
--更新操作
declare
    cursor c_user_update
    is
    select * from tuser for update of tuser.id;
    c_row c_user_update%rowtype;
    --定义一个变量,类型与表中指定字段的类型一致
    c_name tuser.name%TYPE;
begin 
    for c_row in c_user_update loop
    if c_row.name='name' then
      c_name:=c_row.name||'---';
      dbms_output.put_line(c_name);
    end if;
    update tuser set name=c_name where CURRENT OF c_user_update;
    end loop;
end;

 

 

参考:http://www.2cto.com/database/201501/371435.html

          http://www.cnblogs.com/sc-xx/archive/2011/12/03/2275084.html

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics