本系列链接导航:

[独孤九剑]Oracle知识点梳理(一)表空间、用户

[独孤九剑]Oracle知识点梳理(二)数据库的连接

[独孤九剑]Oracle知识点梳理(三)导入、导出

[独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL

[独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View

[独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

[独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor

[独孤九剑]Oracle知识点梳理(八)常见Exception

[独孤九剑]Oracle知识点梳理(九)数据库常用对象之package

[独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数

5.6、cursor操作

  游标的使用场景大致有:

    a) 显示游标:function或procedure中,用于获取某些值进行遍历操作

    b) 动态游标:procedure中,用于返回查询结果

5.6.1、显示游标:在代码段、function、procdeure中创建cursor,用于取值

  • 隐式游标
 declare
cursor myCursor is
select name from person;
  vNames varchar2(128);
begin
  --遍历游标
  for c in myCursor loop --隐式打开、关闭游标
    vNames:=vNames||','||c; -- 可以包含复杂逻辑
  end loop;
end;
  • 显示游标
 declare
  cursor myCursor is --定义游标
    select * from person;
  my_c myCursor%rowtype --定义游标变量
begin
  open myCursor;
  loop
    fetch myCursor into my_c;
    exit when c%notfound;
    /*code here*/ --编写复杂逻辑
  end loop;   Exception
    when others then
      close myCursor;   if myCursor%isopen then
    close myCursor;
end;

  上面写的两个列子比较简单,下面是网上摘抄显示游标例子,很详细:

  对于显式游标的运用分为四个步骤:

  • 定义游标---Cursor [Cursor Name] IS;
  • 打开游标---Open [Cursor Name];
  • 操作数据---Fetch [Cursor name]
  • 关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。

  以下是三种常见显式Cursor用法。
1)Set serveroutput on;

 declare
  ---define Cursor
  Cursor cur_policy is
    select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account
        from t_contract_master cm
        where cm.liability_state = 2
            and cm.policy_type = 1
            and cm.policy_cate in ('','','')
            and rownum < 5
        order by cm.policy_code desc;
  curPolicyInfo cur_policy%rowtype;---定义游标变量
Begin
  open cur_policy; ---open cursor
  Loop
    --deal with extraction data from DB
    Fetch cur_policy into curPolicyInfo;
    Exit when cur_policy%notfound;     Dbms_Output.put_line(curPolicyInfo.policy_code);
  end loop;
  Exception
    when others then
      close cur_policy;
    Dbms_Output.put_line(Sqlerrm);   if cur_policy%isopen then
    --close cursor
    close cur_policy;
  end if;
end; /

2) Set serveroutput on; 

 declare
  Cursor cur_policy is
    select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account
      from t_contract_master cm
      where cm.liability_state = 2
        and cm.policy_type = 1
        and cm.policy_cate in ('','','')
        and rownum < 5
      order by cm.policy_code desc;
  v_policyCode t_contract_master.policy_code%type;
  v_applicantId t_contract_master.applicant_id%type;
  v_periodPrem t_contract_master.period_prem%type;
  v_bankCode t_contract_master.bank_code%type;
  v_bankAccount t_contract_master.bank_account%type;
Begin
  open cur_policy;
  Loop
    Fetch cur_policy into v_policyCode,
                v_applicantId,
                v_periodPrem,
                v_bankCode,
                v_bankAccount;
    Exit when cur_policy%notfound;     Dbms_Output.put_line(v_policyCode);
  end loop;
  Exception
28    when others then
      close cur_policy;
    Dbms_Output.put_line(Sqlerrm);   if cur_policy%isopen then
    close cur_policy;
  end if;
end;
/

3)Set serveroutput on; 

 declare
  Cursor cur_policy is
    select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account
        from t_contract_master cm
        where cm.liability_state = 2
          and cm.policy_type = 1
          and cm.policy_cate in ('','','')
          and rownum < 5
        order by cm.policy_code desc;
Begin
  For rec_Policy in cur_policy loop
    Dbms_Output.put_line(rec_policy.policy_code);
  end loop;
  Exception
    when others then
    Dbms_Output.put_line(Sqlerrm); end; /

5.6.2、动态游标:在procdeure中使用cursor,用于返回查询结果

  与隐式Cursor,显式Cursor的区别:

  • Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。
  • 而另外两种Cursor(隐式游标和显示游标),是静态的,在编译期间就决定数据结果集。

5.6.2.1、定义动态游标

 Declare
  ---define cursor type name
  type cur_type is ref cursor;
  cur_policy cur_type;
  sqlStr varchar2(500);
  rec_policy t_contract_master%rowtype;
begin
  ---define 动态Sql
  sqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,
              cm.bank_account from t_contract_master cm
          where cm.liability_state = 2
              and cm.policy_type = 1
              and cm.policy_cate in (2,3,4)
              and rownum < 5
            order by cm.policy_code desc ';
  ---Open Cursor
  open cur_policy for sqlStr;
  loop
    fetch cur_policy into rec_policy.policy_code, rec_policy.applicant_id, rec_policy.period_prem,
                  rec_policy.bank_code,rec_policy.bank_account;
    exit when cur_policy%notfound;     Dbms_Output.put_line('Policy_code:'||rec_policy.policy_code);   end loop;
close cur_policy; end;
/

另外,在定义package时,可以在包头中定义动态游标类型,在包体中使用,如在procedure中用于定义返回参数类型。详见package的操作。

[独孤九剑]Oracle知识点梳理(七)数据库常用对象之Cursor的更多相关文章

  1. [独孤九剑]Oracle知识点梳理(九)数据库常用对象之package

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  2. [独孤九剑]Oracle知识点梳理(六)数据库常用对象之Procedure、function、Sequence

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  3. [独孤九剑]Oracle知识点梳理(五)数据库常用对象之Table、View

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  4. [独孤九剑]Oracle知识点梳理(十)%type与%rowtype及常用函数

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  5. [独孤九剑]Oracle知识点梳理(二)数据库的连接

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  6. [独孤九剑]Oracle知识点梳理(八)常见Exception

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  7. [独孤九剑]Oracle知识点梳理(四)SQL语句之DML和DDL

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  8. [独孤九剑]Oracle知识点梳理(三)导入、导出

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

  9. [独孤九剑]Oracle知识点梳理(一)表空间、用户

    本系列链接导航: [独孤九剑]Oracle知识点梳理(一)表空间.用户 [独孤九剑]Oracle知识点梳理(二)数据库的连接 [独孤九剑]Oracle知识点梳理(三)导入.导出 [独孤九剑]Oracl ...

随机推荐

  1. shell set 命令

    用set命令可以设置各种shell选项或者列出shell变量.单个选项设置常用的特性.在某些选项之后-o参数将特殊特性打开.在某些选项之后使用+o参数将关闭某些特性,不带任何参数的set命令将显示sh ...

  2. 【Flask】Sqlalchemy group_by having

    ### group_by:根据某个字段进行分组.比如想要根据性别进行分组,来统计每个分组分别有多少人 ### having: having是对查找结果进一步过滤.比如只想要看未成年人的数量,那么可以首 ...

  3. PHP面试题汇总一

    1.表单中 get与post提交方法的区别? 答:get是发送请求HTTP协议通过url参数传递进行接收,而post是实体数据,可以通过表单提交大量信息. 2.session与cookie的区别? 答 ...

  4. 大话设计模式之PHP篇 - 策略模式

    什么是策略模式? 定义:策略模式定义了一系列的算法,并将每一个算法封装起来,而且使它们还可以相互替换.策略模式让算法独立于使用它的客户而独立变化. 组成:抽象策略角色: 策略类,通常由一个接口或者抽象 ...

  5. 让FireFox支持 window.event 全局事件对象

    这里比原文稍加改进,让FF也支持 event.srcElement了, 省得每次写兼容代码挺麻烦的: //For firefox window.event if(typeof(window.event ...

  6. Gitblit搭建及Git协作开发流程

    1. 概述 目前主流的是git作为自己代码管理,但是采用github需要付费才能够使用,如果不付费,代码需要公开.创业团队及小型开发团队都有必要搭建自己的代码服务器,自己摸索需要一定的时间,会赶不及项 ...

  7. 一言(ヒトコト)Hitokoto API

    『想要成为无论多么悲伤的时候,也能够漂亮微笑的人吧.』 Hitokoto API 更新:2014.02.22 问题/反馈:api # hitokoto.us 数据获取:[ 数据获取 ] 调用举例:[  ...

  8. pf_ring DNA接收流程代码分析

    经过一个月的学习,对pf_ring DNA的内核部分有了一些认识,本文侧重pf_ring对ixgbe的改动分析. 先说一说接收流程吧,流程如下: 其中,硬中断处理函数是ixgbe_msix_clean ...

  9. 移动端的坑 之 在可编辑的div中实现placeholder

    1.当我们个  div 设置了 contenteditable = "true" 这个块状元素就可以编辑了, 如果要实现 placeholder 直接写上去是没有效果的 <d ...

  10. java对象流(一)

    注意:字节数组流是可以不用关闭的(字符数组流要不要关闭暂时不清楚). 对象流的读数据和写数据方法分别是writeObject(Object o)和readObject(Object o). Objec ...