`

原创:oracle PL/SQL编程基础 下<十二>

阅读更多
游标:  游标(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(4) default 7369)
   is select * from emp
      where empno=pno;
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 /
 
开始
结束
 
 
 
以上内容归redarmy_chen所有,如需转载请附带出处,如有疑问请发送至redarmy_chen@qq.com  



分享到:
评论

相关推荐

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

    Oracle PL/SQL是一种强大的编程语言,它将关系数据库的强大功能与结构化编程的优点结合在一起,是Oracle数据库系统中不可或缺的一部分。在"Oracle PL/SQL 实例精解(第4版涵盖Oracle 11g)+源码脚本"中,读者可以深入...

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

    Oracle PL/SQL是一种强大的编程语言,它结合了SQL(结构化查询语言)的数据库操作功能与PL/SQL的程序设计特性,广泛应用于Oracle数据库的开发和管理。这本书"Oracle PL/SQL从入门到精通"的配套源代码,显然是为了...

    ORACLE PL/SQL从入门到精通

    循环语句是PL/SQL编程中用来重复执行一组语句的结构,包括loop、while、for三种形式,它们各自有不同的使用场景和语法。 分支条件语句在PL/SQL中用来根据不同的条件执行不同的代码分支,主要包括CASE表达式和if-...

    Oracle资料学习PL/SQL必备

    在提供的"PLSQL基础.pdf"文件中,你将可能找到以上各点的详细讲解,从基础概念到实际应用,逐步引导你掌握Oracle数据库的PL/SQL编程。通过深入学习和实践,你将能够编写出高效、可靠的PL/SQL代码,有效管理Oracle...

    Oracle PL/SQL程序设计(第5版)(上下册)

    #### 一、PL/SQL编程基础 - **PL/SQL简介**:PL/SQL(Procedural Language for SQL)是Oracle数据库的一种内嵌式过程化语言,用于增强SQL的功能。它允许在SQL查询的基础上添加控制流语句、变量定义、错误处理等特性...

    Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发

    《Oracle PL/SQL专家指南-高级PL/SQL解决方案的设计与开发》是一本深入探讨Oracle数据库中的PL/SQL编程的专业书籍。PL/SQL是Oracle数据库特有的编程语言,它结合了SQL的查询能力与过程式编程语言的功能,使得数据库...

    PL/SQL编程基础知识

    ### PL/SQL编程基础知识 #### 一、PL/SQL简介 PL/SQL(Procedural Language for SQL)是一种过程化语言,它结合了SQL的数据操纵功能和过程化语言的控制结构,使用户能够灵活地控制数据操作流程。作为Oracle数据库...

    精通Oracle.10g.PLSQL编程

    使用LOB对象&lt;br&gt;16.1 LOB简介&lt;br&gt;16.2 DBMS LOB包&lt;br&gt;16.3 访问LOB&lt;br&gt;16.3.1 访问CLOB&lt;br&gt;16.3.2 访问BLOB&lt;br&gt;16.3.3 访问BFILE&lt;br&gt;16.4 习题&lt;br&gt;第17章 使用Oracle系统包&lt;br&gt;17.1 DBMS_OUTPUT&lt;br&gt;17.2...

    Oracle PL/SQL编程基础

    ### Oracle PL/SQL编程基础详解 #### 一、PL/SQL概述 PL/SQL,即Procedural Language for SQL,是Oracle数据库专有的扩展性语言,用于增强SQL的功能,使其具备编程语言的能力。通过PL/SQL,开发者可以编写复杂的...

    Oracle PL/SQL programming(5th Edition)

    《Oracle PL/SQL Programming》(第五版)是一本全面而深入的指南,旨在帮助读者掌握Oracle PL/SQL编程语言的核心技术和最佳实践。无论是对于初学者还是有经验的开发人员,这本书都是一个宝贵的资源。通过阅读本书,...

    Oracle PL/SQL实例编程(PL/SQL经典书籍)

    Oracle PL/SQL是一种强大的编程语言,它将数据库管理和应用程序逻辑紧密结合起来,是Oracle数据库系统中的核心组件之一。这本书“Oracle PL/SQL实例编程”显然旨在深入讲解如何利用PL/SQL进行实际开发工作,通过实例...

    Oracle PL-SQL编程详解.pdf

    Oracle PL/SQL编程详解主要涵盖了数据库编程的关键方面,旨在帮助...总的来说,Oracle PL/SQL编程详解深入讲解了PL/SQL的各个方面,从基础到高级,帮助开发者掌握在Oracle环境中进行高效、稳定和可靠的数据库编程技能。

    oracle pl/sql fundamentals

    Oracle PL/SQL Fundamentals是Oracle University为学生设计的一份培训指南,旨在深入理解并掌握Oracle数据库中的PL/SQL编程基础。PL/SQL是Oracle数据库特有的结构化查询语言扩展,它结合了SQL的强大功能与过程性编程...

    ORACLE PL/SQL 程序设计(第五版)

    通过学习《ORACLE PL/SQL 程序设计(第五版)》并实践"OPP5.WEB.CODE"中的例子,读者可以全面掌握PL/SQL编程,并能构建复杂的Oracle数据库应用程序。这本书对于数据库管理员、开发者以及对Oracle数据库感兴趣的任何...

    Oracle PL/SQL学习官方教材

    Oracle PL/SQL是一种强大的编程语言,它将SQL与过程编程语言的特性相结合,为数据库开发提供了丰富的功能。...通过深入学习这本教材,你将能够掌握Oracle PL/SQL编程,从而有效地设计和实现数据库解决方案。

    Oracle PL_SQL Language Pocket Reference, 5th Edition.2015.pdf

    ### Oracle PL/SQL 语言袖珍参考手册第五版 (2015) 知识点概览 #### 核心内容概述 《Oracle PL/SQL 语言袖珍参考手册》(第五版)由三位专家Steven Feuerstein、Bill Pribyl和Chip Dawes共同编著,是一本专为Oracle...

    Oracle PL/SQL by Example(4th Edition)

    《Oracle PL/SQL by Example(4th Edition)》是一本专为Oracle数据库用户设计的PL/SQL编程指南,尤其适合那些希望通过实践学习这一强大的过程式语言的开发者。本书的第四版详细介绍了Oracle PL/SQL的各种核心概念和...

    Oracle_PL/SQL编程

    Oracle PL/SQL编程是Oracle数据库系统中的一个核心组成部分,它扩展了SQL的语法,使得数据库管理及应用程序开发更具灵活性和可编程性。PL/SQL融合了SQL查询和控制流语句,提供了处理复杂业务逻辑的能力。 PL/SQL的...

    oracle 9i pl/sql程序设计笔记

    **标题与描述**:本文档围绕“Oracle 9i PL/SQL程序设计笔记”这一核心主题,深入探讨了PL/SQL语言的基础知识及其在Oracle 9i数据库环境中的应用。 **关键词**:Oracle 9i、PL/SQL #### PL/SQL程序结构详解 **2.1...

Global site tag (gtag.js) - Google Analytics