- 浏览: 119503 次
- 性别:
- 来自: 南京
文章分类
- 全部博客 (135)
- java (135)
- [转]c# 画圆角矩形 (1)
- 设计模式生活实例 (1)
- .nET2.0小技巧 (1)
- 从另一个角度看敏捷实践(一)--IPM:承诺的仪式 (1)
- javascript字符串转json对象 (1)
- 使用BeanUtils时,Date类型值为空的解决方法 (1)
- Lenovo V460+Ubuntu 11.10 无线网问题 (1)
- Lucene 索引和搜索过程核心类详解 (1)
- Android短信编解码方式 (1)
- 股神巴菲特十大致富秘籍 (1)
- Map遍历的三种方法 (1)
- Android中用Toast.cancel()方法优化toast内容的显示 (1)
- ViewFlipper “Receiver not registered” Error (1)
- javax.xml.transform.TransformerFactoryConfigurationError (1)
- JNI调用的注意事项 (1)
- JUnit单元测试感悟 (1)
- 用C#写定时关机的程序 (1)
- ASP.NET开发工具Web Matrix介绍 (1)
- MapXtreme2004代码 MapControl控件中显示地图文件 (1)
- 《使用 Microsoft .NET 的企业解决方案模式》读书笔记3 (1)
- 微创短信开发平台 (1)
- 谈谈Q+平台的技术实现 (1)
- 手机防盗软件实现(源码) (1)
- 虚析构函数(总结 帖子) (1)
- c语言中去除const修饰 (1)
- ORA-01012: not logged on 解决办法 (1)
- paypal提现如何省钱 (1)
- 数独suduku (1)
- MyISAM InnoDB 区别 (1)
- 随 笔 (1)
- Android上的log,日志相关 (1)
- 百度质量部实习居然通过了~ (1)
最新评论
-
野狐禅:
ext.get('imagebrowse') is null
ExtJs上传图片预览功能 -
zhuyl_wind:
不切实际,呵呵
[]5年内买车买房-理财篇 -
in南京:
关键你那两千块钱就够交一个多月的房租!换个城市你那六百也远远不 ...
[]5年内买车买房-理财篇 -
javac_xinyun:
呵呵,看完了,确实不错,貌似第一年的房租每月算进去 ,人际关系 ...
[]5年内买车买房-理财篇 -
dishikun:
貌似很不错,就是没把房租算进去!
[]5年内买车买房-理财篇
一 概念
游标是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.
set serveroutput on;begin update t_contract_master set liability_state = 1 where policy_code = '123456789'; if sql%found then dbms_output.put_line('the policy is updated successfully.'); commit; else dbms_output.put_line('the policy is updated failed.'); end if;end;/
运行结果:
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 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 ('2','3','4') 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 ('2','3','4') 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 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 ('2','3','4') 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;/
运行结果:
sql> 8780203932878020322787802032188771289268 pl/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
set serveroutput on;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;/
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 在连接时提供了无效用户名或口令
发表评论
-
百度质量部实习居然通过了~
2012-02-08 12:23 992[size=small;]? ? ?本来打算在软工所苦 ... -
Android上的log,日志相关
2012-02-07 14:18 1535摘自:http://blog.csdn.net/met ... -
随 笔
2012-02-04 13:39 600金风玉露一相逢,便胜却人间无数。英文版: chemis ... -
MyISAM InnoDB 区别
2012-02-02 16:59 737<h1 id="artibody ... -
数独suduku
2012-01-31 14:38 916sudu sudu sudu sudu sudu su ... -
paypal提现如何省钱
2011-12-28 16:58 1224据PayPal中文注册得知,如今很多收样品费的外贸商户 ... -
ORA-01012: not logged on 解决办法
2011-12-28 13:08 3512<span style="font-f ... -
c语言中去除const修饰
2011-12-21 10:54 1435[size=16px;]<span style= ... -
虚析构函数(总结 帖子)
2011-12-21 09:54 706<span style="" ... -
手机防盗软件实现(源码)
2011-12-20 12:54 938<a href="http://blo ... -
谈谈Q+平台的技术实现
2011-12-20 09:49 963这篇文章是我个人 ... -
微创短信开发平台
2011-12-19 11:39 772在网上闲逛,发现了一个站点,微创短信开发平台(http ... -
《使用 Microsoft .NET 的企业解决方案模式》读书笔记3
2011-12-19 10:24 783第3章 Web表示模式 没有一个设计策略能够适合所有情 ... -
MapXtreme2004代码 MapControl控件中显示地图文件
2011-12-15 14:29 912::<?xml:namespace prefix ... -
ASP.NET开发工具Web Matrix介绍
2011-12-15 13:39 970<p class="MsoPlain ... -
用C#写定时关机的程序
2011-12-15 11:14 705</span></font>& ... -
JUnit单元测试感悟
2011-12-14 11:29 864<p class="MsoNorma ... -
JNI调用的注意事项
2011-12-14 09:34 755JNI的简单教程网上很多,看看就能够明白,照着操作也基 ... -
javax.xml.transform.TransformerFactoryConfigurationError
2011-12-13 13:34 854<span style="" ... -
ViewFlipper “Receiver not registered” Error
2011-12-12 10:59 1127偶尔出现这个错误: <span> < ...
相关推荐
- **%NOTFOUND**:如果`FETCH`语句未能从游标中找到任何记录,`%NOTFOUND`为TRUE,表示已到达结果集末尾。 - **%ROWCOUNT**:此属性返回游标执行`FETCH`操作时已处理的行数,而不是结果集中总行数。 - **%ISOPEN*...
Oracle游标,或称为光标,是数据库管理系统中用于处理SQL查询的一种机制,它允许程序逐行处理查询结果。在Oracle中,游标是至关重要的,尤其在进行复杂的交互式数据操作时。当一个应用程序尝试打开过多的游标时,...
使用记录变量可以方便地从游标中提取数据行。当游标选择很多列的时候,那么使用记录变量比为每列声明一个变量要方便得多。记录变量可以使用 TYPE 命令和%ROWTYPE 定义,例如:DECLARE R_emp EMP%ROWTYPE;其中,R_emp...
- `FETCH`:从游标中提取数据。 ##### 2.3 函数示例 最后,我们来看一个函数示例,该函数接受两个日期参数并返回这两个日期之间的天数差: ```sql CREATE OR REPLACE FUNCTION DaysBetween(d1 DATE, d2 DATE) ...
### Oracle中的游标详解 #### 一、引言 在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果...此外,通过使用循环结构,可以有效地遍历游标中的每一行数据,从而实现复杂的业务逻辑处理。
通过`OPEN`语句打开游标,`FETCH`语句用于从游标中获取下一行数据,并将数据赋值给变量`v_empno`, `v_ename`, `v_salary`。当没有更多数据可取时,`c_emp%NOTFOUND`条件为真,退出循环。 #### %TYPE属性 在声明...
在Oracle数据库中,游标(Cursor)是一种非常重要的编程工具,尤其在处理复杂的数据操作时。游标允许我们逐行处理查询结果,这对于迭代、条件判断或者数据更新等任务非常实用。下面,我们将深入探讨Oracle游标的使用...
执行`cs.execute()`后,我们可以从`cs.getObject(1)`获取到游标对象,将其转换为`ResultSet`,然后像处理普通查询结果一样遍历游标中的数据。 请注意,为了运行这段代码,你可能需要在项目中添加Oracle的JDBC驱动...
本文将详细介绍Oracle数据库中的游标概念、分类及其使用方法,并通过具体的例子进行说明。 #### 二、游标的分类 Oracle游标主要分为两大类:显示游标和隐式游标。其中,显示游标又可以根据定义方式的不同细分为...
- FETCH:从游标中获取一行数据。 - NEXT:移动到下一行。 - CLOSE:关闭游标,释放资源。 - CURSOR声明:在PL/SQL中,定义游标结构,包括查询语句。 3. **游标变量** - 可以声明并使用游标变量来存储游标状态...
oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!
- `%FOUND`:用于检查是否已从游标中获取了行。如果最近一次`FETCH`操作成功,`%FOUND`为`TRUE`,否则为`FALSE`。 - `%ISOPEN`:检查游标是否已经打开。如果游标已打开,`%ISOPEN`为`TRUE`,否则为`FALSE`。 - `%...
在Oracle数据库中,游标(Cursor)是一种非常重要的概念,特别是在编写存储过程和函数时。游标允许我们处理单行或多行数据集,一次处理一行,这样可以进行精细化的数据操作。在本篇讨论中,我们将深入理解Oracle游标...
2. **提取数据**:使用`FETCH cursor_name INTO variables`语句从游标中获取数据,变量的数量和类型应与SELECT语句中的列匹配。 3. **处理数据**:在每次提取数据后,可以对提取的记录进行处理。 4. **关闭游标**...
Oracle 游标是 Oracle 数据库中的一种重要概念,用于查询数据库,获取记录集合(结果集)的指针。游标可以看作是一个临时表,你可以对其每一行的数据进行任意的操作。本文将对 Oracle 游标的概念、分类、声明方式、...
- **提取**:使用FETCH语句从游标中获取数据并存入变量。 - **关闭**:使用CLOSE语句关闭游标,释放资源。 以下是一个示例,展示如何使用显式游标更新部门编号为10的所有员工的薪水: ```sql DECLARE CURSOR...
然后,通过`FETCH`命令从游标中获取数据: ```sql FETCH cursor_name INTO variable[,variable,...]; ``` 这里的`variable`是与游标查询结果列相匹配的变量,它们的数据类型应与查询结果列的类型一致。例如: ```sql...
游标是 Oracle PL/SQL 中的一个重要概念,它允许用户访问和操作结果集中的数据。游标可以理解为是一个映射在结果集中的一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了。 游标的分类: *...
3. 处理游标:通过FETCH语句从游标中提取数据,并将其赋值给变量。 ```sql FETCH cursor_name INTO variable1, variable2, ...; ``` 4. 检查游标状态:使用`%NOTFOUND`、`%ISOPEN`、`%ROWCOUNT`等属性检查游标的...
4. **数据更新**:在游标中,可以直接更新当前行的数据,然后通过UPDATE语句提交更改。 然而,游标也有其局限性,例如在处理大量数据时可能效率较低,因为每次只处理一行。因此,优化游标使用,如合理选择游标类型...