`
yinghuayu1324117
  • 浏览: 69541 次
  • 性别: Icon_minigender_2
  • 来自: 保定
文章分类
社区版块
存档分类

oracle笔记(二十一)游标

阅读更多

游标:

  游标(cursor)可以被看作指向结果集(a set of rows)中一行的指针(pointer)。在oracle数据库中可以使用显示或隐式两种游标。

 

隐式游标:

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

   游标的主要属性如下:

      %found 布尔属性  如果sql语句至少影响一行 则为true 否则为false

      %notfound 布尔属性 %found相反。

      %isopen 布尔属性 游标是否打开  打开为true 否则为false

      %rowcount 数字属性 返回受sql语句影响的行数

怎么来使用这些属性呢?

则可以通过 “sql属性名来查看结果

//%rowcount 用来检查受影响的行

SQL> declare

  2    emp_row emp%rowtype;

  3  begin

  4     select * into emp_row from emp where empno=7369;

  5     dbms_output.put_line(sql%rowcount);

  6  end;

  7  /

 

1 //返回的结果为1

//%found用来检查是否影响到了行

SQL> begin

  2     update emp set sal=2000 where empno=7369;

  3     if sql%found then

  4     dbms_output.put_line('更新记录成功 影响了'||sql%rowcount||'');

  5     else

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

  7     end if;

  8  end;

  9  /

更新记录成功 影响了1

 

  // %notfound

  //%isopen

  一以上两个的使用方式参考 %found进行理解。

 

 

另外一种隐式游标cursor for loop可用于处理sql语句的结果集

SQL> begin

  2 

  3  for rec in (select * from emp) loop

  4      dbms_output.put_line(rec.empno||'/'||rec.ename||'/'||rec.job||'/'||rec.mgr||'/'||rec.hiredate||'/'||rec.sal||'/'||rec.comm||'/'||rec.deptno);

  5      end loop;

  6  end;

  7  /

 

 

显示游标

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

1、  声明游标

 声明游标就是通过定义游标的名称,游标的特性来声明游标,以及打开游标后就可调用查询语句,声明的语法如下:

     Cursor cursor_name[parameter[,parameter]….]

     [return return_type] is select_statement;

Parameter作为游标的输入参数,它可以让用户在打开游标式,向游标传递值;语法如下:

  Parameter_name [in] datatype[{:=|default} expression]\

举例:

  declare

   cursor emp_cursor (pno in number default 7369)

   is select * from emp

       where empno=pno;

在指定数据类型时,不能使用长度约束,如number4varchar10)不正确

2、  打开游标

 就是指执行声明游标时指定的查询语句。打开的方式只需使用open打开语法:

 Open cursor_name(参数);

 如果没有指定参数就采用默认值执行select语句

 

3、  检索数据

检索数据就是从检索到的结果集中获取数据保存到变量中,以便变量进行处理。

使用fetch语句找出结果集中的单行,并从中提取单个值传递给主变量。

 语法如下:

   Fetch cursor_name into [variable_list[record_variable]]

变量用于存储检索的数据

 

4、  关闭游标

 

  Close 游标名称

 

综上所述综合案例如下:

SQL> declare

  2  cursor emp_cursor (pno in number default 7369)   //声明游标

  3  is select * from emp where empno=pno;

  4 

  5  emp_row emp%rowtype;  //声明变量

  6  begin

  7        open emp_cursor(7934);  //打开游标

  8        fetch emp_cursor into emp_row; //检索数据  结果为一行

  9        dbms_output.put_line(emp_row.ename);  //输出检索结果

 10 

 11        close emp_cursor; //关闭游标

 12  end;

 13  /

 

 

游标for循环

  依次读取结果集中的行,for循环开始时,游标会自动打开(不需要使用open方法开启),每循环读取一次,系统自动读取当前数据(不需要使用fetch),当退出for循环时,游标也会自动关闭(不需要使用close方法)

SQL> declare

  2  cursor emp_cursor (pno in number default 7369)  //声明游标

  3  is select * from emp where empno=pno;

  4 

  5  begin

  6    for emp_row in emp_cursor(7934) loop //for循环开始时 自动打开游标并且自动获取数据 自动关闭

  7     dbms_output.put_line(emp_row.ename);

  8    end loop;

  9  end;

 10  /

 

 

游标变量

   游标变量也可以处理多行查询结果集。

 游标变量的定义包括两个步骤:

1、  定义cursor类型的指针

语法:

  Type ref_cursor_name is ref cursor[return return_type]

举例:

   Type var_cursor_name is ref cursor;

2、  定义ref cursor类型的变量

  v_rc  var_cursor_name;

综合写法如下:

   Type var_cursor_name is ref cursor;

   v_rc  var_cursor_name;

上面的综合声明的游标变量 称为弱的ref cursor类型,因为它没有指明游标返回的结果,因此它可以指向任何一个具有多列的select查询结果.

 

相对于上面还有一种称为:ref cursor类型.

声明方式如下:

   Type varcursorName is ref cursor return emp%rowtype; //指明了返回的结果

   Vcn varcursorName; //声明一个强的ref cursor类型的变量

 

使用游标变量与游标使用方式一样,也需要声明,打开,检索,关闭游标变量。

 

综合案例如下:

  SQL> declare

  2 

  3  type emp_cname is ref cursor return emp%rowtype;  //声明游标变量第一步

  4 

  5  ecname emp_cname;  //声明游标变量第二步

  6 

  7  emp_row emp%rowtype; //声明用于保存检索数据的变量

  8 

  9  begin

 10      dbms_output.put_line('开始');

 11      open ecname for select * from emp where empno=7934; //打开游标变量

 12      loop

 13       fetch ecname into emp_row; //查询结果赋值给保存的变量

 14       exit when ecname%notfound;  //退出条件

 15       dbms_output.put_line(emp_row.ename); //输出结果

 16      end loop; //退出循环

 17      close ecname;  //关闭游标变量

 18    dbms_output.put_line('结束');

 19  end;

 20  /

 

开始

MILLER

结束

 

//复杂的案例

SQL> declare

  2 

  3  type emp_cname is ref cursor return emp%rowtype;

  4 

  5  ecname emp_cname;

  6 

  7  emp_row emp%rowtype;

  8 

  9  begin

 10      dbms_output.put_line('开始');

 11      open ecname for select * from emp;

 12      loop

 13       fetch ecname into emp_row;

 14       exit when ecname%notfound;

 15       dbms_output.put_line(emp_row.ename);

 16      end loop;

 17      close ecname;

 18    dbms_output.put_line('结束');

 19  end;

 20  /

 

开始

SMITH

ALLEN

WARD

JONES

MARTIN

BLAKE

CLARK

SCOTT

KING

TURNER

ADAMS

JAMES

FORD

MILLER

结束

 

使用游标更新数据库

1、  定位游标之后进行删除|修改指定的数据行 更新的时候需要使用for update选项 语法如下:

Cursor cursor_name is select_statement;

For update[of column[,column],[nowait]]

Of用来指定要锁定的列,如果忽略of那么表中选择的数据行都将锁定。如果被锁定行已经被锁定了,那么必须等待释放才能锁定对于这种情况我们可以使用nowait语句。

 

当使用for update语句声明游标后,可以再delete|update语句中使用where current of子句,修改|删除游标结果集中当前行对应的表中的数据。

 语法如下:

     Where { current of cursor_name|search_condition}

举例说明:

//修改操作

SQL> declare

  2 

  3   cursor ecname is select * from emp where empno=7934

  4   for update of sal nowait;

  5 

  6   esal number(7,2);

  7 

  8 

  9  begin

 10      dbms_output.put_line('开始');

 11 

 12      for r in ecname loop

 13      esal:=r.sal*10;

 14      update emp set sal=esal where current of ecname;

 15      end loop;

 16 

 17     dbms_output.put_line('结束');

 18  end;

 19  /

分享到:
评论

相关推荐

    oracle笔记游标的使用

    oracle笔记游标的使用,游标的详细代码案例,游标知识点笔记!

    ORACLE 游标学习笔记

    Oracle 游标是数据库编程中的重要概念,尤其在PL/SQL中,它们允许程序逐行处理查询结果。游标分为隐式游标和显式游标两种类型。 **隐式游标** 隐式游标是Oracle自动管理的一种游标,主要用于DML(数据操纵语言)...

    oracle笔记(存储过程函数触发器游标流程控制等)

    这份"oracle笔记(存储过程函数触发器游标流程控制等)"涵盖了Oracle数据库管理中的关键知识点,包括但不限于以下几个方面: 1. **存储过程与函数**:存储过程是预编译的SQL语句集合,用于执行特定任务。它们可以提高...

    达内,tarena,oracle笔记,oraclePPT课件,达内oracle笔记

    在达内的Oracle笔记中,可能会详细讲解SELECT语句用于数据检索,INSERT、UPDATE、DELETE用于数据增删改,以及CREATE、ALTER、DROP用于数据库对象管理的语法和用法。 3. **数据库设计**:良好的数据库设计是确保系统...

    Oracle笔记(基于尚学堂马士兵)

    【Oracle笔记(基于尚学堂马士兵)】 Oracle是一款全球广泛使用的大型关系型数据库管理系统,由美国Oracle公司开发。本笔记主要基于尚学堂马士兵老师的教学内容,深入浅出地介绍了Oracle的基本概念、安装配置、SQL...

    oracle经典笔记

    《Oracle经典笔记》是一份深度探讨Oracle数据库管理系统的综合学习资料。这份笔记涵盖了从Oracle PL/SQL编程到SQL查询语言的广泛主题,旨在帮助读者深入理解Oracle数据库的运作机制和应用技巧。 首先,我们来看看...

    oracle_sql笔记

    这篇笔记主要涵盖了Oracle SQL的基础知识、高级特性和实际应用技巧。 一、基础SQL语法 Oracle SQL遵循标准的SQL语法,包括SELECT、INSERT、UPDATE、DELETE四大语句。用于查询数据的基本结构是SELECT字段列表FROM...

    oracle学习笔记(从入门到精通)

    压缩包主要包括15个文档,主要是本人学习oracle过程中的笔记,希望对你有帮助:主要文档如下: 01-常用命令.txt 02-表空间建表.txt 03-基本查询语句学习笔记.txt 04-高级查询语句学习笔记.txt 05-锁和表分区学习...

    学习oracle笔记(word版本)

    以下是一些从“学习Oracle笔记”中提取的关键知识点: 1. **DECODE 函数**:DECODE 函数在Oracle SQL中用于替代简单的IF...ELSE逻辑。在示例中,`decode(sex, '男', 1, 0)` 意味着如果性别为'男',则返回1,否则...

    Oracle笔记及操作

    本文将基于"Oracle笔记及操作"的主题,深入探讨Oracle数据库的一些关键知识点,包括视图、游标、事务以及如何查看系统表中的语法。 首先,让我们来了解**视图**。视图是数据库中的虚拟表,它不存储数据,而是基于一...

    李兴华—oracle课堂笔记(全).rar

    笔记会讲述如何编写存储过程、函数、触发器,以及异常处理和游标的应用。 4. **数据库设计**:良好的数据库设计是系统性能的关键。笔记可能会涉及范式理论,如何进行规范化设计,以及反规范化在特定情况下的应用。 ...

    2011版李兴华主讲-ORACLE实战 最强大的数据库课程MLDN出品—oracle课堂笔记(全).rar

    课程的“oracle课堂笔记(全).pdf”文件很可能是详细的课后总结或讲义,包含了上述所有知识点的详细讲解和实例。通过学习这份资料,你可以巩固对Oracle的理解,提升解决实际问题的能力。 总的来说,这个2011年的...

    韩顺平oracle笔记

    韩顺平的Oracle笔记,作为学习资源,将帮助初学者快速上手Oracle数据库,同时为有经验的DBA提供深入理解Oracle的宝贵材料。通过系统地学习这些笔记,可以全面提升对Oracle数据库的理解和操作能力。

    oracle笔记

    Oracle笔记是针对数据库管理系统Oracle的一款详尽学习资料,它涵盖了Oracle的基础知识、核心概念以及实践操作,对于初学者和有经验的DBA来说都是一份宝贵的参考资料。笔记内容可能包括以下几个方面: 一、Oracle...

    oracle笔记proc代码等

    "Oracle笔记proc代码等"这个标题和描述暗示了我们可能涉及到的是关于Oracle数据库的PL/SQL过程(PROC)编程相关的学习资料。PL/SQL是Oracle专有的SQL扩展,它允许开发者编写存储过程、函数、触发器等,以实现更复杂...

    数据库SQL oracle的笔记,比较全面的

    数据库SQL Oracle笔记全面解析 在IT领域,数据库是存储、管理与检索数据的核心工具,而Oracle作为世界上最流行的商业数据库管理系统之一,其强大的功能和广泛的应用使得掌握Oracle SQL变得至关重要。本笔记将涵盖...

    Oracle笔记,每行代码都经过验证

    Oracle笔记,每行代码都经过验证,如果能把笔记里的例子都敲一遍,保证你学会Oracle,涉及系统结构、安全、查询、锁、表分区、数据库对象、PL/SQL语法、游标、子程序、程序包、触发器、内置程序包、备份与恢复、导入...

    (转)最全的SQL(Oracle)笔记集录

    此外,可能还会讨论Oracle特有的特性和功能,如PL/SQL、游标、触发器、分区表和数据库设计原则。 【标签】:“源码 工具” 这两个标签暗示了笔记中可能包含了实际的SQL源代码示例,帮助读者更好地理解和应用理论...

    Oracle 10g 学习笔记

    这个笔记是学习oracle数据库过程中整理出来的,比较详细,适合于初学者。 │ oracle与tomcat端口冲突.txt │ Oracle学习笔记.pdf │ Oracle学习笔记.wps │ 安装Oracle后myEclipse不能正常使用.txt │ 手工配置...

    Oracle 笔记.docx

    ### Oracle 笔记知识点梳理 #### 一、数据库基础 - **数据的储存方法**: - 大脑记忆:适合少量数据,不适用于长期存储。 - 纸质记录:传统方式,不方便检索和更新。 - 计算机内存:适合临时存储,断电后数据...

Global site tag (gtag.js) - Google Analytics