游标

游标

游标属性:

%ISOPEN:用于确定游标是否已经打开,如果游标已经打开,则返回值为true,如果游标没有打开,则返回值为false

%FOUND:用于检查是否从结果集中提取到了数据。如果提取到数据,则返回值为true,如果未提取到数据,则返回值为false

%NOTFOUND:与% FOUND刚好相反

%ROWCOUNT:用于返回到当前行为止已经提取到实际行数。

使用fetch....into语句提取单条记录

-- Created on 2012/4/28 by CHOWMIN

declare

  -- 定义本地变量

  v_empno   emp.empno%type;

  v_ename   emp.ename%type;

  v_sal emp.sal%type;

 

  --定义游标

  cursor   v_emp_cursor is select empno,ename,sal from emp;

 

begin

  -- Test   statements here

  open   v_emp_cursor;

  loop

    fetch   v_emp_cursor into v_empno,v_ename,v_sal;

    exit when   v_emp_cursor%NOTFOUND;

      DBMS_OUTPUT.put_line('v_empno='||v_empno||' v_ename='||v_ename||' v_sal='||v_sal);

  end loop;

  close   v_emp_cursor;

end;

使用fetch....bulk collect into语句提取所有记录

declare

  --自定义类型

  cursor   emp_cursor is select ename from emp where deptno =10;

  type   ename_table_type is table of varchar2(10);

 

  --声明一个自定义类型的变量

  ename_table   ename_table_type;

begin

  open   emp_cursor;

  fetch   emp_cursor bulk collect into ename_table;

  for i in 1 ..   (ename_table.count) loop

      dbms_output.put_line( ' 雇员名称:' ||ename_table(i));

  end loop;

  close   emp_cursor;

end;

使用fetch....bulk collect into….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( '雇员名称:');

    for i in 1 ..   (emp_cursor%rowcount-v_count) loop

        dbms_output.put(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;

使用游标属性

declare

  type   ename_table_type is table of varchar2(10);

  ename_table   ename_table_type;

 

  cursor   emp_cursor is select ename from emp;

 

begin

  if not   emp_cursor%isopen then

    open   emp_cursor;

  end if;

 

  fetch   emp_cursor bulk collect into ename_table;

  dbms_output.put_line(   '提取的总计行数:'|| emp_cursor%rowcount);

  close   emp_cursor;

end;

基于游标定义记录变量

declare

  cursor   emp_cursor is select ename,sal from emp;

  emp_record   emp_cursor%rowtype;

 

begin

  if not   emp_cursor%isopen then

    open   emp_cursor;

  end if;

  loop

    fetch   emp_cursor into emp_record;

    exit when   emp_cursor%notfound;

      dbms_output.put_line('雇员名称:' || emp_record.ename || ' 雇员工资:' ||emp_record.sal);

  end loop;

  close   emp_cursor;

end;

 

 

 

 

 

 

游标与For循环

-- Created on 2012/4/28 by CHOWMIN

declare

  --定义游标

  cursor   v_emp_cursor is select empno,ename,sal from emp;

 

begin

  -- Test   statements here

  for temp in   v_emp_cursor loop

      DBMS_OUTPUT.put_line('empno='||temp.empno||' ename='||temp.ename||' sal='||temp.sal);

  end loop;

end;

Open-for语句

-- Created on 2012/4/28 by CHOWMIN

declare

  --定义游标

  type   t_emp_cursor is ref cursor return emp%rowtype;

  v_emp_cursor   t_emp_cursor;

  v_emp emp%rowtype;

 

begin

  -- Test   statements here

  open   v_emp_cursor for select * from emp;

  loop

    fetch   v_emp_cursor into v_emp;

    exit when   v_emp_cursor%NOTFOUND;

      DBMS_OUTPUT.put_line('empno='||v_emp.empno||' ename='||v_emp.ename||' sal='||v_emp.sal);

  end loop;

  close   v_emp_cursor;

end;

无约束游标

-- Created on 2012/4/28 by CHOWMIN

declare

  --定义游标

  type t_cursor is ref cursor;

  v_cursor   t_cursor;

 

  v_emp emp%rowtype;

  v_dept dept%rowtype;

 

begin

  -- 查询emp

     DBMS_OUTPUT.put_line('--------------------------查询emp表-------------------------------------');

  open v_cursor for select * from emp;

  loop

    fetch v_cursor into v_emp;

    exit when v_cursor%NOTFOUND;

      DBMS_OUTPUT.put_line('empno='||v_emp.empno||' ename='||v_emp.ename||' sal='||v_emp.sal);

  end loop;

  -- 查询dept

     DBMS_OUTPUT.put_line('--------------------------查询dept表-------------------------------------');

  open v_cursor for select * from dept;

  loop

    fetch v_cursor into v_dept;

    exit when v_cursor%NOTFOUND;

      DBMS_OUTPUT.put_line('deptno='||v_dept.deptno||' ename='||v_dept.dname||' sal='||v_dept.loc);

  end loop;

  -- 关闭游标

  close v_cursor;

end;

posted @ 2012-08-21 18:40  心随梦飞[fosilzhou]  阅读(268)  评论(0编辑  收藏  举报