14-Oracle学习_游标

游标
    指向一个结果集

1, 例子

(1) 取第一条

declare
    -- 声明游标
    cursor c is
        select * from emp;
    v_emp c%rowtype;
begin
    -- 打开游标后, 才会执行select语句, 把结果集放入内存
    open c;
    -- 将当前游标指向的记录内容抓取出来, 放入v_emp中, 并移向下一条记录
    fetch c into v_emp;
    dbms_output.put_line(v_emp.ename);
    -- 关闭游标, 清除内存中的数据
    close c;
end;

(2) 循环取-1 ->loop

declare
    cursor c is
        select * from emp;
    v_emp c%rowtype;
begin
    open c;
    loop
        fetch c into v_emp;
        exit when (c%notfound);
        dbms_output.put_line(v_emp.ename);
    end loop;
    close c;
end;

(3) 循环取-2 ->while

declare
    cursor c is
        select * from emp;
    v_emp emp%rowtype;
begin
    open c;
    fetch c into v_emp;
    while (c%found) loop
        dbms_output.put_line(v_emp.ename);
        fetch c into v_emp;
    end loop;
    close c;
end;

(4) 循环取-3 ->for --(推荐使用)

declare
    cursor c is
        select * from emp;
begin
    for v_emp in c loop
        dbms_output.put_line(v_emp.ename);
    end loop;
end;


2, 游标的四个属性

参考: http://wenku.baidu.com/view/0ed038d5240c844769eaeeb9.html
(1) %isopen 
    测试游标是否打开,没打开的情况下使用fetch语句将提示错误
(2) %found  
    测试前一个fetch语句是否有值,有值将返回true ,不然false
(3) %notfound  
    该属性是%found属性的反逻辑,常被用于退出循环
(4) %rowcount  
    该属性用于返回游标的数据行数


3, 带参数的游标

declare
    -- 带两个形参的游标
    cursor c(v_deptno emp.deptno%type, v_job emp.job%type)
    is
        select ename, sal from emp 
        where deptno = v_deptno and job = v_job;
begin
    -- 打开游标后, 给形参赋值
    for v_temp in c(30, 'CLERK') loop
        dbms_output.put_line(v_temp.ename);
    end loop;
end;


4, 可更新的游标 --> where current of 游标

declare
    cursor c
    is 
        select * from emp2 for update;
begin
    for v_temp in c loop
        if (v_temp.sal < 2000) then
            update emp2 set sal = sal * 2 where current of c;
        elsif (v_temp.sal = 5000) then
            delete from emp2 where current of c;
        end if;
    end loop;
    commit;
end;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值