转自:http://zohan.group.iteye.com/group/wiki/2278-cursor

Oracle中游标Cursor介绍

一  概念
游标是SQL的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来或最终写回数据库。这样数据处理的速度才会提高,否则频繁的磁盘数据交换会降低效率。
二  类型
  Cursor类型包含三种: 隐式Cursor,显式Cursor和Ref Cursor(动态Cursor)。
1. 隐式Cursor:
1).对于Select …INTO…语句,一次只能从数据库中获取到一条数据,对于这种类型的DML Sql语句,就是隐式Cursor。例如:Select /Update / Insert/Delete操作。
2)作用:可以通过隐式Cusor的属性来了解操作的状态和结果,从而达到流程的控制。Cursor的属性包含:
SQL%ROWCOUNT 整型 代表DML语句成功执行的数据行数
SQL%FOUND  布尔型  值为TRUE代表插入、删除、更新或单行查询操作成功
SQL%NOTFOUND 布尔型 与SQL%FOUND属性返回值相反
SQL%ISOPEN 布尔型 DML执行过程中为真,结束后为假
3) 隐式Cursor是系统自动打开和关闭Cursor.
下面是一个Sample:

Sql代码 :
Set Serveroutput on;beginupdate t_contract_master set liability_state = 1 where policy_code = '123456789';if SQL%Found thendbms_output.put_line('the Policy is updated successfully.');commit;elsedbms_output.put_line('the policy is updated failed.');end if;end;/

Set Serveroutput on;beginupdate t_contract_master set liability_state = 1 where policy_code = '123456789';if SQL%Found thendbms_output.put_line('the Policy is updated successfully.');commit;elsedbms_output.put_line('the policy is updated failed.');end if;end;/

在PL/SQL中run:

Sql代码 :
SQL> the policy is updated failed.PL/SQL procedure successfully completed

SQL> the policy is updated failed.PL/SQL procedure successfully completed

2. 显式Cursor:
(1) 对于从数据库中提取多行数据,就需要使用显式Cursor。显式Cursor的属性包含:
游标的属性   返回值类型   意    义 
%ROWCOUNT   整型  获得FETCH语句返回的数据行数 
%FOUND  布尔型 最近的FETCH语句返回一行数据则为真,否则为假 
%NOTFOUND   布尔型 与%FOUND属性返回值相反 
%ISOPEN 布尔型 游标已经打开时值为真,否则为假

(2) 对于显式游标的运用分为四个步骤:
 定义游标---Cursor  [Cursor Name]  IS;
 打开游标---Open  [Cursor Name];
 操作数据---Fetch  [Cursor name]
 关闭游标---Close [Cursor Name],这个Step绝对不可以遗漏。
(3)以下是三种常见显式Cursor用法。
1)

Sql代码 :
Set serveroutput on;declare ---define CursorCursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order by cm.policy_code desc;curPolicyInfo cur_policy%rowtype;---定义游标变量
Beginopen cur_policy; ---open cursorLoop --deal with extraction data from DBFetch cur_policy into curPolicyInfo;Exit when cur_policy%notfound;Dbms_Output.put_line(curPolicyInfo.policy_code);end loop;Exception when others thenclose cur_policy;Dbms_Output.put_line(Sqlerrm);if cur_policy%isopen then  --close cursor close cur_policy;end if;
end;/

Set serveroutput on;declare ---define CursorCursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order by cm.policy_code desc;curPolicyInfo cur_policy%rowtype;---定义游标变量
Beginopen cur_policy; ---open cursorLoop --deal with extraction data from DBFetch cur_policy into curPolicyInfo;Exit when cur_policy%notfound;Dbms_Output.put_line(curPolicyInfo.policy_code);end loop;Exception when others thenclose cur_policy;Dbms_Output.put_line(Sqlerrm);if cur_policy%isopen then  --close cursor close cur_policy;end if;
end;/

2)

Sql代码 :
Set serveroutput on;declare Cursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order 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;
Beginopen 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 when others thenclose cur_policy;Dbms_Output.put_line(Sqlerrm);if cur_policy%isopen then   close cur_policy;end if;
end;
/

Set serveroutput on;declare Cursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order 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;
Beginopen 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 when others thenclose cur_policy;Dbms_Output.put_line(Sqlerrm);if cur_policy%isopen then   close cur_policy;end if;
end;
/

3)

Sql代码:
Set serveroutput on;declare Cursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order by cm.policy_code desc;
BeginFor rec_Policy in cur_policy loopDbms_Output.put_line(rec_policy.policy_code);end loop;Exception when others thenDbms_Output.put_line(Sqlerrm);end;/

Set serveroutput on;declare Cursor cur_policy isselect cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_accountfrom t_contract_master cmwhere cm.liability_state = 2and cm.policy_type = 1and cm.policy_cate in ('2','3','4')and rownum < 5order by cm.policy_code desc;
BeginFor rec_Policy in cur_policy loopDbms_Output.put_line(rec_policy.policy_code);end loop;Exception when others thenDbms_Output.put_line(Sqlerrm);end;/

run pl/sql,执行结果如下:

Sql代码 :
SQL> 8780203932
8780203227
8780203218
8771289268PL/SQL procedure successfully completed

SQL> 8780203932
8780203227
8780203218
8771289268PL/SQL procedure successfully completed

3. Ref Cursor(动态游标):
1) 与隐式Cursor,显式Cursor的区别:Ref Cursor是可以通过在运行期间传递参数来获取数据结果集。而另外两种Cursor,是静态的,在编译期间就决定数据结果集。
2) Ref cursor的使用:
 Type [Cursor type name] is ref cursor
 Define 动态的Sql语句
 Open cursor
 操作数据---Fetch  [Cursor name]
 Close Cursor
下面是一个Sample:

Sql代码 :
Set serveroutput on;Declare---define cursor type nametype cur_type is ref cursor;cur_policy cur_type;sqlStr varchar2(500);rec_policy t_contract_master%rowtype;
begin---define 动态SqlsqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cmwhere 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 Cursoropen cur_policy for sqlStr;loopfetch 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;
/

Set serveroutput on;Declare---define cursor type nametype cur_type is ref cursor;cur_policy cur_type;sqlStr varchar2(500);rec_policy t_contract_master%rowtype;
begin---define 动态SqlsqlStr := 'select cm.policy_code, cm.applicant_id, cm.period_prem,cm.bank_code,cm.bank_account from t_contract_master cmwhere 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 Cursoropen cur_policy for sqlStr;loopfetch 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;
/

4.常见Exception

Sql代码 :
1. 错 误 名 称 错误代码    错 误 含 义
2.  CURSOR_ALREADY_OPEN ORA_06511   试图打开已经打开的游标
3.  INVALID_CURSOR  ORA_01001   试图使用没有打开的游标
4.  DUP_VAL_ON_INDEX    ORA_00001   保存重复值到惟一索引约束的列中
5.  ZERO_DIVIDE ORA_01476   发生除数为零的除法错误
6.  INVALID_NUMBER  ORA_01722   试图对无效字符进行数值转换
7.  ROWTYPE_MISMATCH    ORA_06504   主变量和游标的类型不兼容
8.  VALUE_ERROR ORA_06502   转换、截断或算术运算发生错误
9.  TOO_MANY_ROWS   ORA_01422   SELECT…INTO…语句返回多于一行的数据
10. NO_DATA_FOUND   ORA_01403   SELECT…INTO…语句没有数据返回
11. TIMEOUT_ON_RESOURCE ORA_00051   等待资源时发生超时错误
12. TRANSACTION_BACKED_OUT  ORA_00060   由于死锁,提交失败
13. STORAGE_ERROR   ORA_06500   发生内存错误
14. PROGRAM_ERROR   ORA_06501   发生PL/SQL内部错误
15. NOT_LOGGED_ON   ORA_01012   试图操作未连接的数据库
16. LOGIN_DENIED    ORA_01017   在连接时提供了无效用户名或口令  

Oracle中游标Cursor介绍相关推荐

  1. Oracle中游标Cursor基本用法详解

    这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...

  2. Oracle中游标(Cursor)介绍和使用

    一  概念  游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处 ...

  3. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...

    1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...

  4. oracle中的cursor属性有哪些,Cursor语法及理解

    游标的两种概念 共享游标 : 是用户提交 SQL 或 PL/SQL 程序块到 Oracle 的 share pool 之后,在 library cache 中生成的一个可执行对象,这个对象我们称之为游 ...

  5. oracle中 游标实例

    游标-----内存中的一块区域,存放的是select的结果           游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集 ...

  6. oracle中的cursor属性,Oracle Cursors语法总结

    一.Oracle的Cursors概念: 游标:用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. 二.Oracle的Cursors分类: 1.静态游标 ...

  7. oracle中游标分类,Oracle 游标分类以及实例

    /*Oracle游标,从字面理解就是游动的光标.用数据库语言来描述就是:游标是映射在结果集中一行数据上的位置实体, 有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据 ...

  8. oracle的游标cursor

    6,如何使用显示游标,?如何遍历循环游标? ①使用显示游标 ⑴声明游标:划分存储区域,注意此时并没有执行Select 语句. CURSOR 游标名( 参数 列表) [返回值类型] IS Select ...

  9. oracle nvl函数3个参数,oracle中的函数介绍(一):nvl函数、decode函数、case when函数、sum函数...

    最近做项目接触到的oracle数据库比较多,经常用到里面的一些函数,以前的博客中也介绍过行转列和列转行,这次再简单给大家介绍几个: nvl() NVL(a,b)就是判断a是否是NULL,如果不是返回a ...

最新文章

  1. ES6常用新特性---笔记一
  2. linux 压缩和解压缩(zip/unzip)
  3. Android批量打包 如何一秒内打完几百个apk渠道包
  4. XML文档处理(树的应用)
  5. enum 有什么好处_高新技术企业认定四个核心评分标准是什么?软著能加分吗?...
  6. Annotation 使用备忘2
  7. 递增序列(迭代加深)
  8. Filenet 周报丨2020.01.06-2020.01.19
  9. html文字排版步骤,CSS text-align内容位置排版教程
  10. 注册表修复工具+强制卸载工具
  11. 类似飞秋的局域网软件_局域网办公、社交情怀工具之浅见
  12. 推荐几个检索论文及代码的网站
  13. python余弦函数_Python cos() 函数
  14. (十六)《汇编语言(王爽)》 | 实验 10:编写子程序
  15. Haproxy基础知识
  16. GBase 8s HAC集群简介
  17. iOS 实现背景颜色渐变的方式
  18. GraalVM安装与配置
  19. Nature封面:宇宙物质起源的证据找到了!12国团队耗时十年,中微子不对称揭示宇宙秘密...
  20. 大数据技术的概述(1)

热门文章

  1. Python写个小游戏:速算24点(下)
  2. pod一直处于ContainerCreating,查看报错信息为挂载错误MountVolume.SetUp failed for volume
  3. C++STL之map详解
  4. 基于SPRINGBOOT果多多水果电商平台
  5. 洛谷——P6386 [COCI2007-2008#4] VAUVAU(java实现)
  6. Android 调用系统中的相机应用及静默拍照
  7. 移动哨兵远程监控系统方案
  8. 恒驰冬测 恒大汽车迎性能大考
  9. 读取统计微信捐款(matlab)
  10. 计算机网络学习笔记(二)——网络边缘