Oracle中游标Cursor介绍
转自: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:
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> 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)
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)
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)
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> 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:
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
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介绍相关推荐
- Oracle中游标Cursor基本用法详解
这篇文章主要介绍了Oracle中游标Cursor基本用法详解,还是比较全面的,具有一定参考价值,需要的朋友可以了解下. 查询 SELECT语句用于从数据库中查询数据,当在PL/SQL中使用SELECT ...
- Oracle中游标(Cursor)介绍和使用
一 概念 游标是SQL的一个内存工作区,由系统或用户以变量的形式定义.游标的作用就是用于临时存储从数据库中提取的数据块.在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处 ...
- oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...
1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...
- oracle中的cursor属性有哪些,Cursor语法及理解
游标的两种概念 共享游标 : 是用户提交 SQL 或 PL/SQL 程序块到 Oracle 的 share pool 之后,在 library cache 中生成的一个可执行对象,这个对象我们称之为游 ...
- oracle中 游标实例
游标-----内存中的一块区域,存放的是select的结果 游标用来处理从数据库中检索的多行记录(使用SELECT语句).利用游标,程序可以逐个地处理和遍历一次检索返回的整个记录集 ...
- oracle中的cursor属性,Oracle Cursors语法总结
一.Oracle的Cursors概念: 游标:用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作. 二.Oracle的Cursors分类: 1.静态游标 ...
- oracle中游标分类,Oracle 游标分类以及实例
/*Oracle游标,从字面理解就是游动的光标.用数据库语言来描述就是:游标是映射在结果集中一行数据上的位置实体, 有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据 ...
- oracle的游标cursor
6,如何使用显示游标,?如何遍历循环游标? ①使用显示游标 ⑴声明游标:划分存储区域,注意此时并没有执行Select 语句. CURSOR 游标名( 参数 列表) [返回值类型] IS Select ...
- oracle nvl函数3个参数,oracle中的函数介绍(一):nvl函数、decode函数、case when函数、sum函数...
最近做项目接触到的oracle数据库比较多,经常用到里面的一些函数,以前的博客中也介绍过行转列和列转行,这次再简单给大家介绍几个: nvl() NVL(a,b)就是判断a是否是NULL,如果不是返回a ...
最新文章
- ES6常用新特性---笔记一
- linux 压缩和解压缩(zip/unzip)
- Android批量打包 如何一秒内打完几百个apk渠道包
- XML文档处理(树的应用)
- enum 有什么好处_高新技术企业认定四个核心评分标准是什么?软著能加分吗?...
- Annotation 使用备忘2
- 递增序列(迭代加深)
- Filenet 周报丨2020.01.06-2020.01.19
- html文字排版步骤,CSS text-align内容位置排版教程
- 注册表修复工具+强制卸载工具
- 类似飞秋的局域网软件_局域网办公、社交情怀工具之浅见
- 推荐几个检索论文及代码的网站
- python余弦函数_Python cos() 函数
- (十六)《汇编语言(王爽)》 | 实验 10:编写子程序
- Haproxy基础知识
- GBase 8s HAC集群简介
- iOS 实现背景颜色渐变的方式
- GraalVM安装与配置
- Nature封面:宇宙物质起源的证据找到了!12国团队耗时十年,中微子不对称揭示宇宙秘密...
- 大数据技术的概述(1)