`
zpx138332
  • 浏览: 46104 次
  • 性别: Icon_minigender_1
  • 来自: 河北
社区版块
存档分类

oracle基础总结(十三)

阅读更多

游标

   在通过select语句查询时,返回的结果通常是多行记录组成的集合。这对于程序的设计语言而言,并不能够处理以集合形式返回的数据,为此,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  /

 

开始

结束

//删除操作

 

 

 

 

 

分享到:
评论

相关推荐

    oracle的总结 很详细的 基础也有

    本文将基于标题和描述中的内容,对Oracle的基础知识、安装步骤以及SQL查询语句进行详尽的阐述。 首先,新安装的Oracle数据库的配置步骤至关重要。在安装完成后,需要通过Database Configuration Assistant(DBCA)...

    oracle 基础知识总结初学者必备

    ### Oracle基础知识总结初学者必备 Oracle数据库作为一款广泛使用的数据库管理系统,在企业和开发领域扮演着重要的角色。对于初学者而言,掌握其基础知识是非常必要的。本文将根据提供的内容进行深入解析,并结合...

    Oracle核心基础总结

    "Oracle核心基础总结"涵盖了Oracle数据库系统的基础知识,对于初学者和需要巩固基础的IT从业者来说,是非常宝贵的资源。以下是Oracle核心基础的一些关键知识点: 1. 数据库概念:了解数据库的基本构成,如表、索引...

    oracle基础总结

    系统的总结了oracle的基础知识,对oracle基础想补充的朋友应该很有帮助,语言简练,都是开发时常用到的知识

    Oracle 基础知识总结

    以下是对Oracle基础知识的详细总结: 第一章:Oracle概述 Oracle数据库是Oracle公司的产品,提供了一整套数据管理解决方案。它支持多种操作系统平台,如Windows、Linux、Unix等。Oracle采用SQL作为查询语言,并提供...

    oracle 学习心得与总结

    以下是我对Oracle学习的一些心得和总结,主要聚焦于数据库对象,尤其是表及其约束。 1. **数据库对象**: 数据库对象是Oracle中的基本组成部分,包括表、视图、索引、存储过程、函数、触发器等。这些对象共同构成...

    oracle基础命令总结.docx

    以下是对文档中提到的Oracle基础命令的详细解释: 1. **数据泵语句**:Oracle数据泵(Data Pump)是一种高速数据传输机制,用于在数据库之间导入和导出数据。创建目录对象是为了指定数据泵操作的数据文件存放位置。...

    oracle学习总结(适合刚学习oracle的人)

    本文将根据"oracle学习总结(适合刚学习oracle的人)"这一主题,深入探讨Oracle数据库的基础知识,帮助初学者建立起对Oracle的基本理解。 1. **Oracle简介**:Oracle数据库是由美国甲骨文公司开发的一款产品,它...

    oracle总结oracle总结面试必备

    掌握SQL的基础语法,如SELECT、INSERT、UPDATE、DELETE语句,以及联接(JOIN)、子查询、聚合函数(COUNT、SUM、AVG等)和分组(GROUP BY)等,是每个Oracle开发者的基本功。 二、创建表 创建表是数据库设计的第一...

    oracle学习心得总结

    本文将根据提供的文档内容,总结和扩展Oracle数据库的基础知识点,帮助初级程序员更好地理解和掌握Oracle。 #### 一、Oracle 用户管理 1. **创建用户** - 命令格式:`CREATE USER 用户名 IDENTIFIED BY 密码;` ...

    oracle精品实例,练习总结

    1. **SQL语言**:Oracle数据库的基础是SQL(结构化查询语言),用于数据查询、更新、插入和删除。在实例中,我们可能看到如何使用SELECT语句进行复杂查询,JOIN操作连接多个表,以及如何使用WHERE子句进行条件筛选。...

    oracle 笔记总结

    一、Oracle数据库基础 Oracle数据库采用SQL(结构化查询语言)作为其主要的数据交互方式,支持ACID(原子性、一致性、隔离性和持久性)事务特性,确保数据的完整性和一致性。Oracle数据库系统由多个组件构成,包括...

    oracle个人总结的基础知识

    本总结将深入探讨Oracle基础知识,包括过程、游标、包、视图以及导入导出等关键概念。 首先,让我们关注“过程”。在Oracle中,过程是一系列SQL语句和PL/SQL代码的集合,它们可以执行特定任务。过程可以接受参数,...

    oracle数据库基础命令总结(纯手工打造)

    本文将深入讲解Oracle数据库的基础命令,涵盖数据库的基本概念、关系数据库模型、数据操作语言(DDL、DML、DCL)以及数据库设计方法。 首先,理解数据库基础至关重要。数据库是一个组织和存储数据的系统,它允许...

    Oracle基础知识总结_oracle_

    Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性...

    oracle 基础知识整理

    总结,Oracle基础知识涵盖了数据库架构、数据类型、SQL操作、表空间管理以及备份恢复策略等多个方面。掌握这些基础知识对于理解和使用Oracle数据库至关重要,有助于构建高效稳定的企业级数据环境。

    oracle个人总结

    Oracle数据库是世界上最广泛使用的数据库管理系统之一,主要用于存储和管理...这些是Oracle数据库的基础知识,对于理解和操作Oracle数据库至关重要。通过深入学习和实践,可以更好地掌握Oracle的各种特性和高级功能。

    oraclePPT总结及笔记

    - 数据模型:介绍三种主要的数据模型——层次模型、网状模型和关系模型,其中Oracle数据库基于关系模型。 - SQL语言:SQL(结构化查询语言)是与Oracle交互的主要工具,用于查询、插入、更新和删除数据。 2. **...

Global site tag (gtag.js) - Google Analytics