`
tjmzgn
  • 浏览: 161771 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

游标(一)

阅读更多
使用游标
当在pl/sql块中执行查询语句(select)和数据操纵语句时,Oracle会为其分配上下文区,游标是指向上下文区的指针。
pl/sql包含隐含游标和显示游标等两种游标类型,其中隐含游标用于处理select into和DML语句,而显示游标专门用于处理select
语句返回的多行数据。
1.使用显示游标
显示游标包括定义游标、打开游标、提取数据和关闭游标四个阶段
             declare    open     fetch     close
(1) 定义游标
语法如下:  CURSOR cursor_name IS select_statement;
cursor_name 用于指定的游标名称。
select_statement 用于指定游标所对应的select语句。
(2) 打开游标---当打开游标时,Oracle会执行游标所对应的select语句,并且将select语句的结果暂时存放在结果集中。
    语法如下:   OPEN cursor_name;      游标名必须是在定义部分已经被定义的游标。
(3) 提取数据---使用fetch语句提取游标数据
    2种方式: 语法一 FETCH cursor_name INTO variable1,variable2,......;
    语法二 FETCH cursor_name BULK COLLECT INTO collect1,collect2,.........
    variable1 用于指定接收游标数据的变量,collect用于指定接收游标结果的集合变量。注意当使用
    语法一时,必须要使用循环语句处理结果集的所有数据。
(4) 关闭游标---在提取并处理了结果集的所有数据之后,就可以关闭游标并释放其结果集了。
语法如下: CLOSE cursor_name;
2.显示游标属性---用于返回显式游标的执行信息
  语法: 游标名+游标属性  c1%ISOPEN
  (1) %ISOPEN   用于判断游标是否打开。
  (2) %FOUND    该属性用于检查是否从结果集中提取到了数据。
      eg: LOOP
      FETCH c1 INTO var1,var2;
      IF c1%FOUND THEN
      .......
        ELSE
        EXIT;
        END IF
      END LOOP;
(3) %NOTFOUND
(4) %ROWCOUNT ---用于返回到当前行为止已经提取到的实际行数。
     LOOP
     FETCH c1 INTO my_ename,my_deptno;
      IF c1%ROWCOUNT >10 then
      .......
      END IF;
     
     END LOOP;
===========================================================================================
列出部门编号是10的员工姓名。
declare
  CURSOR c1 IS select ename from emp where emp.deptno=10;
  var_ename varchar2(50);
begin
  open c1;
  Loop
       FETCH c1 INTO var_ename;
       EXIT WHEN c1%NOTFOUND;
       dbms_output.put_line(var_ename);
  end loop;
end;
用 fetch  bulk collect into 的写法;

declare
  CURSOR ename_cursor IS select ename from emp where emp.deptno=10;
  TYPE ename_table_type IS TABLE OF varchar(50)『此处不能用%type』;
  ename_type ename_table_type;
begin
  open ename_cursor;
  fetch ename_cursor bulk collect into ename_type;
  for i in 1..ename_type.count LOOP
     dbms_output.put_line(ename_type(i));
  END LOOP;
  CLOSE ename_cursor;
end;
============================================================================================================================
当使用fetch...bulk collect into 语句提取数据时,默认情况下会提取结果集的所有数据.如果结果集
含有大量数据,并且使用varray集合变量接收数据,那么可能需要限制每次提取的行数。
下面以每次提取5行数据为例,说明使用limit子句限制提取行的方法:
declare
type name_array_type is varray(5) of varchar2(10);
name_array name_array_type;
CURSOR emp_cursor IS select ename from emp;
rows int:=5;
v_count int:=0;
begin
open emp_cursor;
loop
   fetch emp_cursor bulk collect into name_array limit rows;
   dbms_output.put_line('emp_cursor%rowcount='|| emp_cursor%rowcount);
   dbms_output.put_line('v_count='|| v_count);
   dbms_output.put_line('雇员名:');
   for i in 1..(emp_cursor%rowcount-v_count) Loop
       dbms_output.put_line(name_array(i)||'  ');
   end Loop;
   dbms_output.new_line;
   v_count:=emp_cursor%rowcount;
   exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;


       
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics