`

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 /

分享到:
评论

相关推荐

    ORACLE_PlSql-甲骨文学习笔记

    №4从游标中获取记录 9 №5关闭游标 9 №6完整的示例 9 №7游标与for循环 10 6 异常 10 7 存储过程 11 №1创建过程 11 №2调用过程 12 №3获取过程信息 12 №4删除过程 12 №5查看过程中的错误 13 №6实际应用示例...

    精通SQL 结构化查询语言详解

    17.4.1 显式游标与隐式游标 17.4.2 游标的属性  17.4.3 %TYPE、%ROWTYPE定义记录变量  17.4.4 参数化游标  17.4.5 游标中的循环  17.4.6 游标变量 17.5 小结  第18章 事务控制与并发处理 18.1 SQL...

    PL/SQL 基础.doc

    数字: 0-9; 空白: TAB , SPACE , 回车; 符号: +_)(*&^%$#@!~ ; PL/SQL对大小写不敏感(注意) 4. 标识符命名规则答: 1) 字母开头; 2) 后跟任意的 非空格字符 数字 货币符号( $ ) 下划线( _ ) 或 # ; 3) ...

    精通SQL--结构化查询语言详解

    17.4.1 显式游标与隐式游标 365 17.4.2 游标的属性 366 17.4.3 %type、%rowtype定义记录变量 367 17.4.4 参数化游标 368 17.4.5 游标中的循环 369 17.4.6 游标变量 371 17.5 小结 372 第18章 事务控制与并发...

    SQl 函数说明大全

    5.游标函数 返回有关游标状态的信息。 6.日期和时间函数 可以更改日期和时间的值。 7.数学函数 执行三角、几何和其他数字运算。 元数据函数 返回数据库和数据库对象的属性信息。 8.排名函数 是一种非确定性函数,...

    MSSQL数据库查看器

    、数据库基本对象的查看(库、表、主键、过程、函数、触发器、游标、视图等) 、数据库相关系统信息 、建表脚本 、表字段相关信息 、表内数据前100条 、存储过程脚本 、过程参数列表 、数据库基本操作(分离、...

    精通sql结构化查询语句

    以SQL Server为工具,讲解SQL语言的应用,提供了近500个曲型应用,读者可以随查随用,深入讲解SQL语言的各种查询语句,详细介绍数据库设计及管理,详细讲解存储过程、解发器和游标等知识,讲解了SQL语言在高级语言中...

    表的相关查询(最全面的查询语句集合)

    其中包括有: --1、表的相关查询 ---模糊表名的联合查询.. --查询表的默认值 --查询一个表的所有外键 ...--9、动态语句语法 --10、SQL SERVER 2005 同步复制技术 --11、处理表中重复记录....等多种查询方法

    PLSQL基础教程

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13...

    PLSQL程序设计

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    oracle学习资料

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    plsql_oracle 编程

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    plsql_oracle 8i 编程讲义

    §2.4.2 复合类型 9 §2.4.3 使用%ROWTYPE 11 §2.4.4 LOB类型* 11 §2.4.5 Bind 变量 11 §2.4.6 INDEX BY TABLES 12 §2.4.7 数据类型的转换* 13 §2.5 运算符和表达式(数据定义) 13 §2.5.1 关系运算符 13 §...

    Oracle 从入门到精通视频教程(11G版本)(ppt)

    第9章-视图,数据库中虚拟的表 什么是视图 视图的创建 操作视图数据的限制 视图的修改 视图的删除 第10章-存储过程,提高程序执行的效率 什么是存储过程 在SQL*Plus中创建存储过程 使用PL/SQL工具创建存储...

    Oracle 10g 开发与管理

    2.游标的属性:(获取游标的状态) 64 3.另一种隐式游标 64 (二)显示游标 64 1.声明 64 2.打开和关闭 65 3.检索数据 65 (三)游标For循环 65 (四)游标变量 (动态游标) 66 1.定义 66 2.声明游标变量 66 3.打开游标...

    mysql面试题,面试会问到的基础问题

    9. 游标是什么? 10. 你能向我简要叙述一下SQL Server 中使用的一些数据库对象吗? 11. NULL是什么意思? 12. 什么是索引,有哪些索引,具体怎么用? 13. SQL Server 里有什么类型的索引? 14. 什么是主键? 15. 什么...

    SQL_SERVER应用与开发范例宝典_12357672.part2

    全书共提供了463人个实例,每个实例都突出实用性,其中大部分是程序开发者所需的有关问题的解决方案。  本书配有光盘,光盘提供了书中所有实例的源代码。全部代码都经过精心调试,都可以正常运行。  本书适用...

    SQL_SERVER应用与开发范例宝典_12357672.part1

    全书共提供了463人个实例,每个实例都突出实用性,其中大部分是程序开发者所需的有关问题的解决方案。  本书配有光盘,光盘提供了书中所有实例的源代码。全部代码都经过精心调试,都可以正常运行。  本书适用...

    SQL应用开发范例宝典:SQL应用开发范例宝典.iso (源码光盘)

    全书共提供了463人个实例,每个实例都突出实用性,其中大部分是程序开发者所需的有关问题的解决方案。  本书配有光盘,光盘提供了书中所有实例的源代码。全部代码都经过精心调试,都可以正常运行。  本书适用...

Global site tag (gtag.js) - Google Analytics