PL/SQL(八):编写游标

来源:互联网 发布:国外p图软件 编辑:程序博客网 时间:2024/06/07 23:59

一、游标


    是Oracle系统在内存中开辟的一个工作区,在其中存放select语句返回的查询结果。


二、游标分类


    1、隐式游标
        1)PL/SQL隐式建立并自动管理这一游标
        2)隐式游标属性
    SQL%ROWCOUNT     返回最近一条SQL语句所影响到的记录的数量(整数型)
    SQL%FOUND     布尔型属性,当游标或游标变量被打开但是在执行FETCH语
                         句之前时, %FOUND是NULL。其后,如果最后的FETCH语句
                         返回一行或多行记录,则%FOUND为TRUE,如果FETCH语句
                         没有返回记录,则%FOUND为FALSE。                                     
    SQL%NOTFOUND     布尔型属性,当游标或游标变量被打开但是在执行FETCH语
                         句之前时, %NOTFOUND是NULL。其后,如果最后的
                         FETCH语句返回一行记录,则%NOTFOUND为FALSE,如果
                         FETCH语句没有返回记录,则%NOTFOUND为TRUE。     

    SQL%ISOPEN         当游标或游标变量被打开时,为TRUE;否则为FALSE

   2、显示游标

        由用户显式声明,查询返回多行记录
        要访问查询结果的所有记录,可以通过fetch语句,进行指针的移动来实现
        使用游标进行操作,包括定义游标、打开游标、提取数据、关闭游标四步。

        不能对游标赋值,也不能在表达式中使用游标名  

        显示游标的属性                        属性类型描述
        %ISOPEN                  布尔如果游标是打开的,其值为TRUE
        %NOTFOUND          布尔如果FETCH 语句没有返回记录,其值为TRUE
        %FOUND                  布尔如果FETCH 语句返回一行记录,其值为TRUE;  与%NOTFOUND相反
        %ROWCOUNT        数量返回迄今为止已经从游标中取出的记录数目

三、游标处理


1、使用游标前,应首先打开游标
2、游标指针只能向下移动,不能回退

3、将提取的行值存入一个PL/SQL record 中能方便地处理活动集中的行



四、示例代码

4.1 隐式游标

begin  for temp in (select * from T_SCORE where STU_ID='1000') loop    dbms_output.put_line(temp.exam_score);  end loop;  dbms_output.put_line('*************');    update T_SCORE set T_SCORE.EXAM_SCORE = 88.8 where STU_ID='1000';  dbms_output.put_line(sql%rowcount); --最近执行的SQL影响的行数。查询是不影响的   end;

4.2 显示游标的标准写法

--1)loop方式declare   --1.1 定义游标  cursor t_score_cur is         select * from T_SCORE where STU_ID = '1001';  score_row T_SCORE%rowtype;begin  if t_score_cur%isopen then             --未打开,不执行    dbms_output.put_line('1游标已经打开');    end if;  --1.2 打开游标  open t_score_cur ;     --1.3 读取行记录,先fetch 在读取单行记录  loop    fetch t_score_cur into score_row ;     exit when t_score_cur%notfound;    dbms_output.put_line(score_row.STU_ID);    dbms_output.put_line(score_row.EXAM_SCORE);  end loop;  --1.4 关闭游标  close t_score_cur;end;--2)whle 方式declare  cursor t_score_cur is         select * from T_SCORE where STU_ID = '1001';   score_row T_SCORE%rowtype;begin   open t_score_cur;  fetch t_score_cur into score_row;    while(t_score_cur%found) loop   --t_score_cur 有值 继续循环    dbms_output.put_line(score_row.STU_ID);    dbms_output.put_line(score_row.EXAM_SCORE);     fetch t_score_cur into score_row;  end loop;    close t_score_cur;end; 

4.3 显示游标的常规写法

declare    cursor t_score_cur is         select * from T_SCORE where STU_ID = '1001';begin  for temp in t_score_cur loop    dbms_output.put_line(temp.STU_ID);    dbms_output.put_line(temp.EXAM_SCORE);  end loop;    --再次打开游标  for temp in t_score_cur loop    dbms_output.put_line(temp.STU_ID);    dbms_output.put_line(temp.EXAM_SCORE);  end loop;end;

4.4 带参数的游标


declare    cursor t_score_cur is         select * from T_SCORE where STU_ID = &stuId;begin  for temp in t_score_cur loop    dbms_output.put_line(temp.STU_ID);    dbms_output.put_line(temp.EXAM_SCORE);  end loop;  end;--2 带参方式二declare    cursor t_score_cur( stuId T_SCORE.STU_ID%type ) is         select * from T_SCORE where STU_ID = stuId;begin  for temp in t_score_cur(&stuId) loop    dbms_output.put_line(temp.STU_ID);    dbms_output.put_line(temp.EXAM_SCORE);  end loop;end;--3 显示开/关游标declare  cursor t_score_cur(stuId T_SCORE.STU_ID%type) is       select * from T_SCORE where T_SCORE.STU_ID = stuId;  t_score_row T_SCORE%rowtype;  begin  open t_score_cur('1001');  loop    fetch t_score_cur into t_score_row;    exit when t_score_cur%notfound;    dbms_output.put_line(t_score_row.STU_ID);    dbms_output.put_line(t_score_row.EXAM_SCORE);  end loop;  close t_score_cur;    dbms_output.put_line('---------------');    open t_score_cur('1000');  loop    fetch t_score_cur into t_score_row;    exit when t_score_cur%notfound;    dbms_output.put_line(t_score_row.STU_ID);    dbms_output.put_line(t_score_row.EXAM_SCORE);  end loop;  end;