`

oracle游标的简单使用规则

阅读更多

 

oracle 游标

 

最近对 oracle 中的游标有了新的认识所以写出来给大家分享分享。

在通过 select 语句查询时,返回的结果通常是多行记录组成的集合。这对于程序设计语言而言,并不能够处理以集合形式返回的数据,为此, sql 提供了游标机制。游标充当指针的作用,使应用程序设计的语言一次只能处理查询结果的一行。在 oracle 中可以使用显式和隐式两种游标。

同时对于 PL/SQL 程序中所发出的 dml select 语句, oracle 都会自动的声明“隐式游标”。为了处理 select 语句返回一组记录,需要在 PL/SQL 程序中声明和处理“显式游标”。

隐式游标

在执行 sql 语句时, oracle 服务器会自动的创建一个隐式的游标。这个游标是内存中处理该语句的工作区域,其中存储了执行 sql 语句的结果。通过游标的属性可知道 sql 的执行结果,以及游标的状态信息。

游标的主要属性:

* %Found boolean 布尔型,如果 sql 影响了一行,则为 true 否则为 false;

* %NotFound boolean 布尔型 ,与 Found 相反 ;

* %IsOpen boolean 布尔型,当游标已达开始返回 true 否则返回 false;

* %RowCount 数字型属性返回 sql 影响的行数。

注:当使用隐式游标的属性时,属性前要加上 sql ,因为 oracle 在创建隐式游标时,默认的游标名为 sql

Boolean 布尔类型的值不能用 dnms_output.putline() 输出

ü 隐式游标的使用

SQL> begin

2 update emp

3 set sal=800

4 where empno=1;

5 if sql%notfound then

6 dbms_output.put_line(' 未更新记录');

7 else

8 dbms_output.put_line(' 更新'|| sql%rowcount||'');

9 end if;

10 end ;/

注:游标的属性信息总是反应最新的 sql 语句处理结果。

SQL> declare

2 empr emp%rowtype;

3

4 begin

5 update emp

6 set sal=800

7 where empno=1;

8 if sql%notfound then

9 dbms_output.put_line(' 未更新记录');

10 else

11 dbms_output.put_line(' 更新'|| sql%rowcount||'');

12 end if;

13 select * into empr from emp where empno=1;

14 dbms_output.put_line(' 更新'|| sql%rowcount||'');

15 end

16 ;

17 /

更新1

更新1

PL/SQL procedure successfully completed

SQL>

ü 另一种隐式游标 cursor( 光标 )

Cursor for loop

begin

for emps in (select empno,ename,job,hiredate,sal,comm,deptno from emp)

loop dbms_output.put_line(emps.empno||emps.ename||emps.job||emps.hiredate||emps.sal||emps.comm);

end loop;

end ;

使用 cursor for loop 遍历查询的结果集

显式游标

显式游标是在 PL/SQL 程序中使用包含 SELECT 语句来声明的游标。如果需要处理从数据库中检索的一组记录,则可以使用显式游标。使用先是游标处理数据需要四个 PL/SQL 步骤:

ü 声明游标

声明游标就是通过定义游标的名称、游标特征来声明游标,以及打开游标后就可用来调用查询语句。使用游标之前必须先声明游标。声明游标的语法如下:

Cursor 游标名字 [( 参数 )[ 参数 ]…] [return 返回的类型 ] is 查询的语句

Declare

Cursor empc (empno_p number default 1) is

Select * from emp where empno=empno_p;

注: number 不能有长度 否则报错

ü 打开游标

打开游标就是执行声明游标时所指定的查询语句。游标必须声明后才能打开。打开游标也就是调用游标中的 select 语句。

Open 游标名称;

例如打开上面的的游标

Open empc;

ü 检索数据

检索数据就是从检索到的结果集中获取数据保存到变量中,以便在程序中进行处理。检索数据就是使用 fetch 语句找出结果集的单行病从中提取单个值传给主变量。

Fetch 的语法:

Fetch 游标名字 into 主变量名称;

游标中包含一个指针,他将自动记录由 fetch 返回的下一行,最初的它设置为从查询的第一行。因此第一次执行 fetch 语句时,他将检索第一航中的数据保存到变量中。在随后的每执行一个 fetch 语句时,将指针移动到结果集的下一行。可以再循环中用 fetch 语句,这样每一次循环都会从表中读取一行数据,然后进行相同逻辑的处理。如果游标中没有剩余记录时,那么属性 %found 返回 false ,循环也就随之结束。

ü 关闭游标

关闭游标就是不能再从查询结果中检索数据。

Close 游标名称 ;

例如关闭上面的游标

Close empc;

ü 完整案例

declare

cursor empc (empnop number default 1)

is select * from emp where empno=empnop;// 声明现实的游标

type empt is record(

empno emp.empno%type,

ename emp.ename%type,

job emp.job%type,

mgr emp.mgr%type,

hiredate emp.hiredate%type,

sal emp.sal%type,

comm emp.comm%type,

deptno emp.deptno%type ); 记录类型

 

empr empt; 声明记录类型

begin

open empc(2);

loop

fetch empc into empr; 游标检索数据

exit when empc%notfound;

end loop;

dbms_output.put_line(empr.ename||empr.hiredate);

close empc;

end ;

注:使用 select * from table 表时 其数据库中的表的结果的顺序和声明记录类型声明的顺序要相同 否则会报出如下错误

SQL> select * from emp;

EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO

数据表中列的顺序

SQL> declare

2 cursor empc (empnop number default 1)

3 is select * from emp where empno=empnop;

4 type empt is record(

5 empno emp.empno%type,

6 ename emp.ename%type,

7 job emp.job%type,

8 hiredate emp.hiredate%type,

9 mgr emp.mgr%type,

10 sal emp.sal%type,

11 comm emp.comm%type,

12 deptno emp.deptno%type );

13 empr empt;

14 begin

15 open empc(2);

16 loop

17 fetch empc into empr;

18 exit when empc%notfound;

19 end loop;

20 dbms_output.put_line(empr.ename||empr.hiredate);

21

22 close empc;

23 end ;

24 /

declare

cursor empc (empnop number default 1)

is select * from emp where empno=empnop;

type empt is record(

empno emp.empno%type,

ename emp.ename%type,

job emp.job%type,

hiredate emp.hiredate%type,

mgr emp.mgr%type,

sal emp.sal%type,

comm emp.comm%type,

deptno emp.deptno%type );

empr empt;

begin

open empc(2);

loop

fetch empc into empr;

exit when empc%notfound;

end loop;

dbms_output.put_line(empr.ename||empr.hiredate);

close empc;

end ;

ORA-06550: 18 , 17 :

PLS-00386: 发现

分享到:
评论

相关推荐

    ORACLE游标与异常处理

    首先,让我们来理解Oracle游标。游标是数据库系统提供的一种机制,允许用户在结果集上进行迭代,一次处理一行数据。在PL/SQL中,游标用于检索SQL查询返回的结果集,并按需逐行处理。以下是一个简单的游标使用示例: ...

    Oracle11g从入门到精通2

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    Ibatis.net+ oracle 简单事例

    对于Oracle,可能需要利用其特有的函数或特性,如PL/SQL存储过程、游标等。 3. **SQL映射接口**:在.NET 类中创建对应的接口,这个接口的方法对应XML文件中的SQL语句,实现业务逻辑与SQL的绑定。 4. **事务管理**...

    Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本

    书中会介绍如何定义和使用触发器来实现业务规则和审计功能。 8. **性能优化**:Oracle 11g引入了许多性能优化技术,如绑定变量、索引、物化视图等。本书会讨论如何利用PL/SQL编写高效的代码,并通过分析和调优提高...

    navicat中创建存储过程、触发器和使用游标的简单实例(图文)

    本文将详细介绍如何在Navicat中创建存储过程、触发器以及使用游标进行数据操作。 1. **存储过程**: 存储过程是一组为了完成特定功能的SQL语句集合,可以在数据库中预先编译并存储,后续需要时只需调用即可。在...

    Oracle通解API

    1. 数据查询:如何使用SELECT语句进行简单的选择、投影、连接、分组、排序和子查询。 2. 数据操纵:INSERT、UPDATE和DELETE语句用于插入、修改和删除数据,以及如何使用BULK COLLECT和FORALL进行批量操作。 3. 数据...

    Oracle PlSql 存储过程

    在 Oracle 中,数据表别名不能加 as,这是因为 Oracle 的语法规则不允许这么做。 2. 在存储过程中,select 某一字段时,后面必须紧跟 into,如果 select 整个记录,利用游标的话就另当别论了。 在存储过程中,如果...

    oracle pl/sql从入门到精通 配套源代码

    5. **游标和集合操作**:如何使用游标遍历查询结果,以及集合类型的创建和操作,这在处理多行数据时非常常见。 6. **数据库对象操作**:创建、修改和删除表、视图、索引等数据库对象,以及相关的权限管理。 7. **...

    从Sql Server迁移到 Oracle 过程中代码需要调整的地方

    如果需要一个简单的查询,Oracle会使用`FROM dual`,这是一个仅包含一行一列的系统表。 3. **Top关键字**: - SQL Server中,`TOP`关键字用于获取前n行记录。Oracle中没有等效的直接方法,通常使用`rownum`结合子...

    oracle入门很简单02.zip

    Oracle数据库系统是全球广泛使用的大型关系型数据库管理系统之一,尤其在企业级应用中占据着重要地位。"Oracle入门很简单02.zip"这个压缩包显然旨在为初学者提供一个轻松上手Oracle的学习资源,通过"真的很简单"的...

    oracle练习题关于触发器的作业

    Oracle数据库是世界上最流行的数据库管理系统之一,尤其在企业级应用中占据主导地位。它拥有丰富的功能,其中触发器(Triggers)是实现复杂业务逻辑的重要工具。本篇文章将深入探讨Oracle中的触发器及其在实际问题...

    Oracle11g从入门到精通

    《Oracle11g从入门到精通》面向数据库管理人员和数据库开发人员,从实际角度出发,系统地介绍了数据库和Oracle的相关概念和原理、Oracle的数据库管理(如安装与启动,用户权限、备份与恢复等),以及Oracle的应用...

    codesmith连接oracle 的驱动包

    Oracle Data Provider for .NET(ODP.NET)是Oracle公司提供的用于.NET应用程序的数据库驱动程序,它提供了全面的数据库功能,包括连接池管理、事务处理、游标处理等。在使用Codesmith时,确保已经安装了相应的ODP...

    oracle.pdf

    使用、复制、披露、修改和适应程序,包括文档和技术数据,应受Oracle许可协议中规定的许可限制约束,并在适用的情况下,遵循FAR 52.227-19中的额外权利规定。 以上信息综合了Oracle数据库及其PL/SQL语言的基本概念...

    Oracle package

    ### Oracle Package 和 Package Body 使用详解 #### 一、Oracle Package 概念介绍 在Oracle数据库中,`Package` 是一种非常强大的工具,它允许开发者将相关的数据类型、常量、变量、游标、子程序(过程和函数)等...

    数据库oracle中PLSQL语句简介及使用方法的举例说明

    Oracle数据库中的PL/SQL(Procedural Language/Structured Query Language)是一种强大的编程语言,它将SQL的查询功能与过程式编程语言的控制结构相结合,为数据库管理提供了更高级别的抽象和控制。PL/SQL是Oracle...

    ORACLE数据库SQL语句编写优化总结

    最后,ORACLE数据库内部操作对性能的优化也非常关键,如使用显式的游标来控制数据的处理流程。同时,分离表和索引也是一个提高性能的策略,它减少了I/O操作和提高了数据访问的效率。 总结以上内容,ORACLE数据库SQL...

    超详细Oracle教程

    - **游标**:介绍CURSOR的使用方法,包括显式游标和隐式游标。 - **函数**:讲解如何创建和使用自定义函数。 #### 二十一、存储过程 - **存储过程创建**:讲解如何使用CREATE PROCEDURE语句创建存储过程。 - **调用...

    Oracle8i中的plsql學習(初級到中級)

    从初级到中级的学习,意味着你需要从简单的SQL操作过渡到复杂的业务逻辑处理,理解如何设计和优化PL/SQL代码,以及如何利用PL/SQL更好地管理和操作Oracle数据库。在这个过程中,不断实践和解决实际问题将是提升的...

    oracle 存储过程学习经典

    ### Oracle存储过程学习经典知识点...了解并掌握Oracle存储过程的使用方法对于数据库开发者来说至关重要。 - **未来发展方向**: 随着技术的发展,存储过程的应用场景将会更加广泛,特别是在大数据处理和云计算领域。

Global site tag (gtag.js) - Google Analytics