设为首页 收藏本站
查看: 738|回复: 0

[经验分享] oracle学习笔记(第八章:游标)

[复制链接]

尚未签到

发表于 2016-8-8 07:39:27 | 显示全部楼层 |阅读模式
游标Cursor (有带参数的游标和不带参数的游标) :
使用步骤:
1,定义游标 :
Cursor  cur _name  is  select 语句;-- 不带参数
Cursor  cur_name(v_var datatype default) is select 语句;-- 带参数语句
2,打开游标 :
Open cur_name; -- 不带参数
Open cur_name(value); -- 带参数语句,打开时必须给变量赋值,如果变量有默认值,可以不赋值
3,提取数据 :
Fetch cur_name into v_var;-- 常用在循环语句中
4,关闭游标 :
Close cur_name;

可以将游标放在 for 循环中,这样就不需要 打开,提取,关闭游标步骤
可以使用 %found , %notfound 得知游标是否检索到数据,使用 %rowcount 游标检索到多少行数据


如果要没有找到数据退出游标可以使用 exit when cur_name%notfound;
例子1(不带参数):
DECLARE
  VEMP_NO   EMP_M.EMP_NO%TYPE;
  VEMP_NAME EMP_M.EMP_NAME%TYPE;
  VEMP_SEX  EMP_M.EMP_SEX%TYPE;
  CURSOR CUR_TEST IS SELECT EMP_NO FROM EMPM;
BEGIN
  OPEN CUR_TEST;
  LOOP
    FETCH CUR_TEST  INTO VEMP_NO, VEMP_NAME, VEMP_SEX; --如果用Fetch语句提取光标中的行﹐那么into后面的参数必须与游标中select中的列数相同﹐且一一对应
    DBMS_OUTPUT.PUT_LINE(VEMP_NO);
    EXIT WHEN CUR_TEST%NOTFOUND;
  END LOOP;
  CLOSE CUR_TEST;
END;
例子2(带参数):
declare
cursor parm_cur(vemp_age number) is select  emp_nm from empm where age>vemp_age;
vemp_name varchar2(10);
begin
open parm_cur(22);
        loop
        fetch parm_cur into vemp_name;  
    dbms_output.put_line(vemp_name);
    exit when parm_cur%notfound;   
end loop;
close parm_cur;            
end;
例子3:
DECLARE
  CURSOR cur_parm(v_Age INT) IS SELECT EMP_NM FROM EMPM WHERE age = v_Age;
BEGIN
  FOR  I  IN cur_parm(22) LOOP
    DBMS_OUTPUT.PUT_LINE(I.EMP_NM);
  END LOOP; --循环结束后﹐不需要用close命令关闭光标
END;

游标变量:
使用cursor变量﹐可以动态的决定select语句
建立 cursor 变量﹕
1.  定义一个 REF CURSOR 型态.
2.  宣告 cursor 变量.
3.  开启 cursor 变数并与查询关连
declare
type empm_type is ref cursor return empm%rowtype;--确定了cursor查询结果返回的类型 (当然也可以不确定返回类型)
cur_type empm_type;
empm_rec empm%rowtype;
begin
open cur_type for select * from empm where emp_no = '001';--动态的决定select语句
loop
fetch cur_type into empm_rec;
exit when cur_type%notfound;
dbms_output.put_line('emp_no='||empm_rec.emp_no||','||'emp_name='||empm_rec.emp_nm);
end loop;
close cur_type;
dbms_output.put_line('-------------------------------------------------');
  open cur_type for select * from empm;--动态的决定select语句
  loop
    fetch cur_type into empm_rec;
    exit when cur_type%notfound;
    dbms_output.put_line('emp_no='||empm_rec.emp_no||','||'emp_name='||empm_rec.emp_nm);
  end loop;
  close cur_type;
end;

游标与 update 语句 cursor for update,用来更新检索到的数据
DECLARE
CURSOR cur IS SELECT * FROM empm WHERE age <= 30 FOR UPDATE OF age;
BEGIN
     FOR i IN cur LOOP
         UPDATE empm SET age =22 WHERE CURRENT OF cur;
         COMMIT;
     END LOOP;
END ;

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-254701-1-1.html 上篇帖子: oracle学习笔记(第七章:匿名块) 下篇帖子: oracle学习笔记(第十二章:包)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表