六、游标

六、游标

一、定义游标

declare

 Cursor cursor_name is select ename from emp; --声明游标指定一个集给它

 v_name emp.ename%type;

begin

 open cursor_name;                       --打开游标

 fetch cursor_name into v_name;   --每次into取游标中的一行

 dbms_output.put_line(v_name);

 close cursor_name;                      --关闭游标

end;

二、显示游标属性

1%isopen:  --打开游标

实例:

declare

   Cursor cursor_name is select ename from emp;

    begin

if c1%isopen then

  dbms_output.put_line('游标已经打开了');

else

  open c1;

end if;

end;

2%found        --检查是否从结果集中提取了数据

3notfound    --没有从结果集中提取数据

4%ROWCOUNT    --返回当前行为已经提取到的实际行数

declare

 Cursor cursor_name is select ename from emp; --select_statement用于指定游标所对应的select语句

 v_name emp.ename%type;

begin

 open cursor_name;

 loop                       --打开游标

   fetch cursor_name into v_name;--into每次只能取一个值

   exit when cursor_name%notfound;

   dbms_output.put_line(v_name);--每次循环输出一次名字

   dbms_output.put_line(cursor_name%rowcount);--每次循环输出一次行数

 end loop;

 close cursor_name;                      --关闭游标

end

 

游标属性使用:游标名%属性,一般用于判断条件和终止循环;

 

三、游标的应用

1、用游标指向的集合做数据类型

declare

 cursor emp_cursor(no number) is select ename,sal from emp empno=no; --带一个参数不能定义大小

 emp_record emp_cursor%rowtype; --游标集合类型的变量

begin

  open emp_cursor(7934);--打开游标时给参数赋值

  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;

 

   2--使用游标for循环

declare

  cursor emp_cursor is select ename,sal from emp;

begin

  for emp_record in emp_cursor loop--emp_cursor有多数据就执行多少次 没次指针移动一次 将值给emp_record

    dbms_output.put_line('第'||emp_cursor%rowcount||'个雇员'||emp_record.ename);

  end loop;

end;

      3、--使用游标for中直接使用子查询

begin

  for emp_record in(select ename,sal from emp) loop--子查询有多少行数据就执行多少次

    dbms_output.put_line(emp_record.ename);

    dbms_output.put_line(emp_record.sal);

  end loop;

    end;

 

四、游标变量

1--输出empno>7900的名字和工资

declare

   type myrec is record(

   name emp.ename%type,

   sal emp.sal%type

 );

   type mycur is ref cursor;--声明一个游标类型

     rec myrec;

     c1 mycur;--游标类型的游标变量

    begin

  open c1 for select ename,sal from emp where empno>7900; --打开游标时选择指向的集合 从而更加方便使用

  loop

    fetch c1 into rec;

    exit when c1%notfound;

    dbms_output.put_line(rec.name||rec.sal);

  end loop;

  close c1;

end;

2--设置游标提取的返回类型

declare

  type myrec is record(

   sal number

 

  );

  type mycur is ref cursor return myrec; --必须是type类型的返回值 不能定义char等类型

  rec myrec;

  c1 mycur;

begin

  open c1 for select sal from emp where empno>7000;  --因为定义的返回值只有一列数据所以只能返回一列数据 类型是number

  loop

    fetch c1 into rec;

    exit when c1%notfound;

    dbms_output.put_line(rec.sal);

  end loop;

  close c1;

    end;

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值