- 浏览: 47920 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
-
guji528:
终于明白,原来不是用service_name连接的
ORA-12505 connection refuse 解决办法及总结
本文转自:http://www.iteye.com/topic/649874
关键字
概念
类型
异常处理
一 概念
游标是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;
- 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;
- /
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; /
在PL/SQL中run:
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;
- /
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;
- /
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;
- /
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; /
run pl/sql,执行结果如下:
SQL> 8780203932 8780203227 8780203218 8771289268 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
下面是一个Sample:
- 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;
- /
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 在连接时提供了无效用户名或口令
发表评论
-
oracle XE ,procedure死循环导致100%CPU解决
2011-03-22 22:19 1391写了个procedure,在cursor里 ... -
Oracle job的那些事
2011-03-12 16:19 1351如果你想每天定时在Oracle里执行一个任务 ... -
oracle procedure 表或视图不存在的问题
2011-03-06 20:44 2198今天在写一个procedure,让其每天定时统计表 ... -
Ubuntu 10.4 Oracle 10g XE 安装手记
2010-05-24 12:43 18961.从oracle网站上下载了linux edition 安装 ... -
Linux 下启动Oracle
2010-05-20 18:07 1130在网上查找 linux下启动oracle的命令, 得到的答案大 ... -
SQL查询优化技巧30则
2010-05-20 10:13 7961.对查询进行优化,应 ... -
ORA-12505 connection refuse 解决办法及总结
2009-12-17 22:40 2494在项目遇到一 ...
相关推荐
Oracle中的Cursor,也称为游标,是数据库管理系统中一个重要的概念,主要用于处理SQL查询返回的多行结果集。游标提供了一种方式,允许程序逐行处理查询结果,而不是一次性加载所有数据。以下是对游标分类及其特性的...
### Oracle数据库中的Cursor详解 #### 一、游标的基本概念 **游标(Cursor)**是Oracle数据库中的一个重要特性,主要用于处理SQL查询返回的结果集。它允许应用程序以更灵活的方式逐行处理查询结果,而非一次性处理...
Oracle数据库中,游标(Cursor)是一个非常重要的概念和工具,它是用于处理多行数据查询结果集的一个数据库对象。在SQL查询执行后,返回的数据不是一次性全部加载到内存中,而是以结果集的方式存储在数据库服务器上...
Oracle数据库中,游标是用于处理SQL语句和查询结果集的一种机制。它提供了一种在应用程序中逐条处理查询返回数据的能力,使得程序能够逐行检索数据集,而不是一次性将全部数据加载到内存中。在游标的使用过程中,...
本文将详细介绍CSS中的cursor属性及其不同值的具体效果,并通过小例子来说明如何在实际网页中使用这些鼠标样式。 首先,我们来理解cursor属性的基本语法。在HTML标签中,可以直接通过style属性为元素指定鼠标的样式...
Cursor是一款现代化的代码编辑器,它基于Visual Studio Code(VS Code)并继承了VS Code的强大功能。Cursor编辑器的界面友好,操作简便,非常适合初学者和中级开发者。通过Cursor编辑器,开发者可以从命令行快速启动...
### Android Cursor 的用法 ...通过以上介绍,我们可以看到 Cursor 在 Android 数据处理中的重要作用。对于初学者而言,熟练掌握 Cursor 的使用技巧是非常有帮助的,能够极大地提升应用程序的数据处理能力。
本篇文章将详细介绍如何使用`Cursor`以及在实际代码中的应用。 首先,我们需要创建一个`SQLiteHelper`类来操作数据库,比如`dbRead5`。`query()` 方法是用于执行SQL查询并返回一个`Cursor`对象。在这个例子中,我们...
《解锁Cursor:开启高效编程新旅程》是一本专注于介绍AI编程工具Cursor的书籍,旨在帮助读者从基础的安装注册到界面熟悉,再到深入理解和使用Cursor的核心功能,最后通过实战演练来提升编程效率。书中详细介绍了...
1. **REF CURSOR介绍** REF CURSOR是一种特殊的变量类型,它可以引用一个打开的游标。它允许过程动态地构建SQL查询,并将结果集作为输出参数传递给调用者。这种方式灵活且高效,特别适合处理未知或动态的查询结果。...
关于Cursor的资源描述和项目源码,以下是一个简要概述: Cursor是一款专为编程与人工智能而设计的编辑器,它集成了GPT技术,并通过其强大的AI模型家族,为用户提供了前所未有的编程体验。Cursor的资源描述可以概括...
本篇文章将详细介绍如何在Java中通过ODBC6驱动获取Oracle存储过程返回的Cursor。 首先,我们需要创建一个Oracle存储过程,该过程定义了一个名为CURSOR_RESULT的REF CURSOR类型。在提供的示例中,我们有一个名为TEST...
"README_CN.md"和"readme.txt"文件通常提供项目的介绍、安装指南和使用说明,尤其是针对中文用户。"go.mod"和"go.sum"文件是Go模块的依赖管理和版本锁定文件,表示该项目可能使用了Go语言的模块系统来管理依赖。 ...
- readme.txt:这个文件包含软件的基本介绍、安装指南、使用说明或者更改日志等重要信息,是用户了解软件的重要起点。 - image:文件类型通常与图片有关,可能是一个软件图标、界面截图或者其他与光标相关的视觉元素...
本文将详细介绍`Cursor`的一些基本操作及其使用方法。 #### `Cursor`简介 `Cursor`是一种轻量级的数据结构,它主要用来封装从数据库中获取的结果集。当执行完SQL查询语句后,会返回一个`Cursor`对象,这个对象包含...
在CSS中,`cursor`属性支持多种预定义的值,下面将详细介绍部分常见的预定义值及其应用场景: 1. **hand** 或 **pointer** - **定义**:当鼠标悬停在可点击的链接或其他可激活元素上时显示手型光标。 - **示例...
下面将详细介绍Oracle游标的工作原理、类型以及如何在实际开发中应用。 1. 游标的工作原理 游标(Cursor)本质上是一种指针,它指向结果集中的特定行。当我们执行一个SELECT语句时,系统会返回一个结果集,游标则...
Cursor介绍** `Cursor`是一个用于随机读写从数据库返回结果集的对象。它提供了一系列方法用于获取查询结果中的数据,如`getInt()`、`getLong()`、`getShort()`、`getString()`等。在使用`Cursor`时,通常需要先...
本文将通过几个示例详细介绍Oracle中游标的使用方法。 #### 明确声明的游标 (Explicit Cursor) 在Oracle PL/SQL块中,可以通过`CURSOR`关键字明确声明一个游标。声明游标时,需要指定查询语句,该查询语句定义了...
在文件名称列表中,"readme.txt"文件通常包含对整个项目或软件包的介绍和说明。在这份文件集中,readme.txt文件可能会详细解释Cursor-cursor插件的用途、安装方法、功能特点以及如何在oh-my-zsh环境中配置和使用该...