`

9、游标相关

 
阅读更多

游标:

游标(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 /

分享到:
评论

相关推荐

    游标和异常处理 游标和异常处理

    但是如果要提取多行数据,就要由程序员定义一个显式游标,并通过与游标有关的语句进行处理。 隐式游标的优点是可以自动地处理 cursorcycle,减少了编程的复杂度,但是它也有一定的局限性,例如不能处理多行数据的...

    Oracle游标使用案例大全

    - 关闭游标:使用CLOSE关键字关闭游标,释放与之相关的资源。 - 释放游标:当PL/SQL块执行完毕或遇到异常时,局部游标会被自动释放;全局游标需要显式关闭和释放。 6. **隐式游标和显式游标** - 隐式游标:...

    Oracle 游标使用大全

    - 应适当地处理游标相关的异常,例如NO_DATA_FOUND和TOO_MANY_ROWS。 10. **游标最佳实践** - 及时关闭游标以释放系统资源。 - 避免在循环中打开和关闭游标,尽可能减少游标操作次数。 - 选择合适的游标类型,...

    游标卡尺的使用方法

    例如,如果副尺0线左侧的主尺刻度为64毫米,而副尺0线后的第9条线与主尺某刻度对齐,则该工件的尺寸为64毫米加上0.18毫米(0.02×9),即64.18毫米。 #### 三、游标卡尺的实际应用与注意事项 ##### 1. 使用方法 -...

    SAK-158游标卡尺内校标准.doc

    10. 校准温度原则为 20±5℃环境,其他相关规定依《检测设备校准作业办法》。 11. 依 3-9 做出标示后,归位并记录于《量检具设备校验履历表》内。 12. 校验合格后,游标卡尺校验周期为一年。 四、 附表: 4-1 仪器...

    sql 游标使用笔记

    当不再需要游标时,使用 `CLOSE my_cursor` 关闭它,释放与游标相关的资源。 9. **解除游标**: 最后,使用 `DEALLOCATE my_cursor` 可以彻底解除游标,释放系统分配给它的内存。 需要注意的是,游标虽然提供了...

    Udemy-Jenkins:游标UdemyIntegraçãocom Jenkins

    "TS"可能是指"Teknoloji Servisleri"(技术服务)或"Test Script"(测试脚本)的缩写,但在上下文中,由于与Jenkins和Udemy的整合相关,我们可以推测这可能指的是理解和应用技术解决方案,特别是涉及到自动化测试和...

    VC自绘的滑块 浮标控件

    `PngSlider.cpp`包含类的实现细节,比如成员函数的定义,特别是与自绘相关的函数。`PngSlider.h`则定义了类的结构,包括成员变量和公开的接口,供其他类或模块调用。 7. **消息映射**:在MFC中,控件的消息处理依赖...

    9数据库原理与应用教程—SQLServer数据库 考试题目.pdf

    2. 索引:索引的作用是加速数据检索,类似于书籍的目录,可以快速定位到相关记录,提高查询效率。索引分为聚集索引和非聚集索引。聚集索引决定了表的物理排序,一个表只能有一个聚集索引;非聚集索引不决定物理排序...

    标定车用永磁电机,永磁游标电机,C,C++源码.zip

    标题中的“标定车用永磁电机,永磁游标电机,C,C++源码”表明这是一个关于汽车领域中永磁电机标定的软件开发项目,使用的编程语言是C和C++。永磁电机在现代电动汽车中扮演着核心角色,它们为车辆提供驱动力,而标定...

    Oracle9i PL_SQL程序设计

    9. **游标表达式(CURSOR EXPRESSION)**:在Oracle9i中,游标表达式提供了一种更简洁的处理单行结果集的方式,无需显式声明和打开游标。 10. **块结构(BLOCKS)**:PL/SQL程序由一个或多个块组成,每个块可以包含...

    Oracle9i Program with PLSQL v1

    9. **游标表达式和集合操作**:PLSQL支持对集合(如PL/SQL表类型)的操作,如关联、索引、迭代和集合函数。 10. **包(Package)**:包是将相关的变量、常量、过程和函数组织在一起的高级构造,增强了代码的复用性...

    OCP Oracle9i SQL考试指南(PDG)

    本指南将详细探讨Oracle9i SQL的相关知识点,帮助备考者顺利通过OCP考试。 1. 数据库概念:理解数据库的基本概念,如关系型数据库模型、表、字段、记录和索引。了解Oracle9i数据库的体系结构,包括内存结构(SGA)...

    Oracle 9i10g PLSQL编程详细

    4. **包(PACKAGE)**:包是将相关的过程、函数和变量封装在一起的机制,可以提高代码的组织性和重用性。包体(BODY)包含实现细节,而包规范(SPECIFICATION)则定义了公有接口。 5. **索引**:优化PL/SQL性能的一...

    oracle9i--pl/sql

    9. **游标变量**:游标变量可以存储游标的查询状态,方便在PL/SQL程序中传递和复用查询结果。 10. **PL/SQL包**:包是封装相关函数、过程和类型的一组实体,提供模块化和重用性,可以提高代码组织和效率。 11. **...

    oracle9i数据库课件

    这个"oracle9i数据库课件"包含了多个PPT文件,详细讲解了Oracle9i的相关知识,包括安装配置、基本操作、安全性、数据库恢复、应用程序开发以及数据库的体系结构等核心主题。 首先,我们来看"第2章 Oracle9i安装配置...

    PLSQL经典练习共9页.pdf.zip

    9. **包(Package)**:包是PLSQL的一个高级特性,它可以封装相关的变量、常量、过程和函数,提供模块化的代码组织方式。 10. **触发器(Trigger)**:触发器是在特定数据库事件发生时自动执行的PLSQL代码,常用于...

    Oracle_9i数据库管理员指南

    9. **PL/SQL增强**:Oracle的编程语言PL/SQL在9i版本中得到了进一步提升,包括新的语法元素、游标增强、异常处理改进等,提升了开发效率。 10. **并行执行**:并行执行是Oracle 9i中的重要特性,允许数据库在多...

Global site tag (gtag.js) - Google Analytics