`
xiewanzhi
  • 浏览: 160588 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

第六章 游标

阅读更多

1、技术目标

  • 游标的使用


2、什么是游标?

游标是查询数据时指向结果集的指针,通过游标可一次访问结果集中
的一行,Oracle有两种游标:

  • 静态游标 ,在编译时知道select语句的游标,静态游标有两种:

    • 隐式游标
    • 显示游标

  • REF游标 ,有时候为游标使用的查询直到代码运行时才确定,
            这种情况使用REF游标(引用游标)和游标变量来实现,
            有两种REF游标:
     

    • 强类型REF游标
    • 弱类型REF游标


3、隐式游标 

PL/SQL为DML语句隐式声明游标,用户不能命名和控制这种游标,所以
称为隐式游标,隐式游标使用属性返回信息,属性 包括:

  • %FOUND ,在DML语句影响一行或多行时返回true
  • %NOTFOUND ,没有影响任何行时返回true
  • %ROWCOUNT ,返回DML语句影响行数,如DML没有影响任何行返回0
  • %ISOPEN ,返回游标是否已打开的值,在SQL语句执行完后,Oracle自动关闭SQL游标,隐式游标的%ISOPEN属性始终为false


注意:通过检查隐式游标的属性可以获取与最近执行时的SQL语句相关的信息

使用1: 用%FOUND属性判断是否获取查询结果,

Sql代码  收藏代码
  1. set serveroutput on  
  2. begin  
  3.     --查询  
  4.     update toys set toyprice=270 where toyid='T005';  
  5.     --判断是否有查询结果  
  6.     if SQL%FOUND then  
  7.         DBMS_OUTPUT.PUT_LINE('表已更新');  
  8.     else  
  9.         DBMS_OUTPUT.PUT_LINE('编号未找到');  
  10.     end if;  
  11. end;  
  12. /  
 


使用2: 用%ROWCOUNT获取SQL语句执行所影响的行数,

Sql代码  收藏代码
  1. set serveroutput on  
  2. begin  
  3.     update vendor_master set venname='Rob Mathew' where vencode='V004'  
  4.     DBMS_OUTPUT.PUT_LINE('更新了' || SQL%ROWCOUNT || '行');  
  5. end;  
  6. /  
 


使用3 :按编号查询员工,判断是否查到,

Sql代码  收藏代码
  1. set serveroutput on  
  2. declare  
  3.     empid varchar2(10);  
  4.     desig varchar2(20);  
  5. begin  
  6.     empid := '&职员编号';  
  7.     --根据员工编号查询出员工职位并给变量desig赋值  
  8.     select designation into desig from employee where empno = empid;  
  9.     if SQL%ROWCOUNT > 0 then  
  10.         DBMS_OUTPUT.PUT_LINE('职员的头衔是:' + desig);  
  11.     end if;  
  12.     exception  
  13.         when NO_DATA_FOUND then  
  14.             DBMS_OUTPUT.PUT_LINE('职员未找到');  
  15. end;  
  16. /  

 


4、显示游标

显示游标是用户显示声明的游标,游标将指向活动集(查询结果)中的当前行,
使用显示游标的步骤: 

    1)声明 
    2)打开 
    3)从游标中获取记录 
    4)关闭游标
 

显示游标在PL/SQL程序的DECLARE部分声明,语法 为:

CURSOR cursor_name [(parameter [, parameter] ...)]
[return return_type] 
IS 
select_statement;

语法说明: 

cursor_name:游标名称
parameter:指定输入参数
return type:定义游标提取的行的类型
select_statement:游标定义的查询语句

游标声明后,可使用如下语句控制游标 :

  • open :打开游标,open cursor_name [ (parameters) ];
  • fetch :从游标中提取行,fetch cursor_name into variables;
    写在循环内,用于从结果集中一次检索一行,
    每次提取后指针就向前移动一行
  • close :关闭游标,close cursor_name,游标处理完后必须关闭


使用1: 声明游标toy_cur,打开并使用该游标提取所有行,

Sql代码  收藏代码
  1. set serveroutput on  
  2. declare  
  3.     --定义变量my_toy_price,其类型与toyprice字段一致  
  4.     my_toy_price toys.toyprice%TYPE;  
  5.     CURSOR toy_cur IS  
  6.         select toyprice from toys  
  7.         where toyprice < 250;  
  8. begin  
  9.     open toy_cur; --打开游标  
  10.     LOOP --循环  
  11.         --循环提取玩具的价格并给变量my_toy_price赋值  
  12.         fetch toy_cur into my_toy_price;  
  13.         --当查询没有返回任何行时退出循环  
  14.         exit when toy_cur%NOTFOUND;  
  15.         --输出玩具价格  
  16.         DBMS_OUTPUT.PUT_LINE(toy_cur%ROWCOUNT || '. 玩具单价:' || my_toy_price);  
  17.     END LOOP;  
  18.     --关闭游标  
  19.     close toy_cur;  
  20. end;  
  21. /  

 

使用2: 用游标操作PRODUCTDETAILS表,

Sql代码  收藏代码
  1. declare  
  2.     --定义变量pro_price,其类型与PRODPRICE字段一致  
  3.     pro_price PRODUCTDETAILS.PRODPRICE%TYPE;  
  4.     --定义变量pro_name,其类型与PRODNAME字段一致  
  5.     pro_name PRODUCTDETAILS.PRODNAME%TYPE;  
  6.     --定义游标pro_cur,查询所有价格小于5000的商品  
  7.     CURSOR pro_cur IS  
  8.         select PRODNAME, PRODPRICE from PRODUCTDETAILS  
  9.         where PRODPRICE < 5000;  
  10. begin  
  11.     open pro_cur; --打开游标  
  12.     LOOP --循环  
  13.         --循环提取商品的名称和价格并赋值给变量pro_name和pro_price  
  14.         fetch pro_cur into pro_name, pro_price;  
  15.         --当查询没有返回任何行时退出循环  
  16.         exit when pro_cur%NOTFOUND;  
  17.         --输出商品名、价格  
  18.         DBMS_OUTPUT.PUT_LINE(pro_cur%ROWCOUNT || ', 商品名:' || pro_name || ', 单价:' || pro_price);  
  19.     END LOOP;  
  20.     --关闭游标  
  21.     close pro_cur;  
  22. end;  
  23. /  
 


5、使用显示游标删除或更新 

语法:cursor cursor_name is select语句 for update [of colums];
注意:select语句只能包括一个表 

游标声明中使用FOR UPDATE子句后,可使用以下语法更新行:

update 表名 set column_name = column_value 
where CURRENT OF cursor_name;

注意:update命令中使用的列也必须出现在for update of子句中,
update和delete语句只有在打开游标并提取到特定行后才能使用
 


使用: 用显示游标更新行,将所有价格低于100的玩具提价10%,

Sql代码  收藏代码
  1. set serveroutput on  
  2. declare  
  3.     new_price number;  
  4.     --定义游标  
  5.     cursor cur_toy is  
  6.     select toyprice from toys where toyprice < 100 for update of toyprice;  
  7. begin  
  8.     open cur_toy;--打开游标  
  9.     LOOP  
  10.         --执行SQL查询语句,提取价格并赋值给变量new_price  
  11.         fetch cur_toy into new_price;  
  12.         --如果没有查询结果,退出循环  
  13.         exit when cur_toy%NOTFOUND;  
  14.         --给价格低于100的商品提价10%  
  15.         update toys set toyprice = 1.1 * new_price where CURRENT OF cur_toy;  
  16.     end loop;  
  17.     close cur_toy;  
    分享到:
    评论

相关推荐

    oracle课件:第六章 游标和异常管理.ppt

    Oracle数据库中的游标和异常管理是数据库编程的重要组成部分,尤其在处理复杂的PL/SQL块时。游标允许程序逐行处理查询结果,提供了一种灵活且高效的数据访问方式。 首先,我们来了解一下游标的基本概念。游标...

    老二牛车第六章理论课游标管理.pdf

    ### Oracle数据库应用——第六章 游标管理 #### 一、引言 在数据库操作中,游标是一种非常重要的机制,特别是在使用Oracle数据库时。游标允许开发人员以编程方式处理查询结果集,使得能够逐行地访问和操作数据。在...

    SQL:第六章显式游标.ppt

    SQL:第六章显式游标.ppt

    老二牛车第六章上机课游标管理.pdf

    ### Oracle数据库应用——游标管理知识点详解 #### 一、隐式游标的使用 隐式游标是由PL/SQL在内部自动创建和管理的一种特殊游标类型,它主要用于处理简单的SELECT INTO语句。 ##### 实现思路 - **声明变量**:首先...

    SQL2005课件资料\SQL Server2005数据库应用系统开发技术资源

    • 第6章 表的创建与管理 • 第7章 数据库安全管理 • 第8章 数据检索 • 第9章 视图 • 第10 章 创建索引文件 • 第11 章 存储过程 • 第12 章 触发器 • 第13 章 游标及事务 • 第14章 数据库的备份与恢复 ...

    ORACLE学习笔记2:日常应用、深入管理、性能优化.

    第6章 数据库物理文件管理 第7章 数据库逻辑对象管理 第8章 常用数据操纵语言 第9章 备份和恢复数据库 第2篇 深入管理 第10章 数据库网络配置 第11章 PL/SQL语言基础 第12章 存储过程和触发器 第13章 游标 ...

    大型数据库系统复习题.doc

    第六章 ORACLE 11g 的数据查询 第七章 ORACLE 数据的基本操作 第八章 索引 第九章 视图 第十章 PL/SQL基础 第十一章 存储过程与函数 第十二章 触发器 第十三章 游标 第十四章 安全管理 第十五章 数据库备份与恢复

    SQL Server 2012从零开始学培训视频和PPT.rar

    第6章认识函数.ppt 第7章Transact-SQL查询.ppt 第8章数据的更新.ppt 第9章规则、默认和完整性约束ppt 第10章创建和使用索引l.ppt 第11章事务和锁.ppt 第12章游标ppt 第13章存储过程和自定义函数。ppt 第14章视图操作...

    Oracle ppt

    6. **第六章 游标和异常管理**:游标是处理单条记录的有效工具,异常管理则保证程序在遇到错误时能有适当的响应。这部分将解释如何在PL/SQL中使用游标,并学习如何编写健壮的异常处理代码。 7. **第七章 PL/SQL子...

    数据库课件

    "第6章 游标存储过程函数触发器包.ppt"涉及Oracle的高级特性,如游标用于循环处理数据,存储过程和函数的编写,以及触发器的使用,这些都是数据库编程中的重要概念。 "第7章 基本数据对象的管理.ppt"将讲解表、视图...

    oracle 入门很简单.zip

    第6章Oracle中的字符型及ppt 第7章Oracle中的数值型ppt 第8章Oracle中的日期型ppt 第9章Oracle中的复杂数据处理ppt 第10章Oracle中的控制语句.ppt 第11章视图ppt 第12章约速ppt 第13章游标pp 第14章触发器ppt 第15章...

    Oracle教程 超详细

    第六章 多表查询 第七章 子查询 第八章 高级查询 第九章 数据字典 第十章 Oracle数据类型 第十一章 Oracle体系结构(DBA) 第十二章 DDL(改变表结构) 第十三章 DML(改变数据结构) 第十四章 约束 第十五章 视图 第十...

    Oracle超详细教程

    第六章 多表查询 第七章 子查询 第八章 高级查询 第九章 数据字典 第十章 Oracle数据类型 第十一章 Oracle体系结构(DBA) 第十二章 DDL(改变表结构) 第十三章 DML(改变数据结构) 第十四章 约束 第十五章 ...

    详细orale教程

    第六章 多表查询 第七章 子查询 第八章 高级查询 第九章 数据字典 第十章 Oracle 数据类型 第十一章 Oracle 体系结构(DBA) 第十二章 DDL(改变表结构) 第十三章 DML(改变数据结构) 第十四章 约束 ...

    ORACLE详细教程

    第六章 多表查询 第七章 子查询 第八章 高级查询 第九章 数据字典 第十章 Oracle 数据类型 第十一章 Oracle 体系结构(DBA) 第十二章 DDL(改变表结构) 第十三章 DML(改变数据结构 第十四章 约束 第十五章 视图 第十...

    信永国际 中文超详细Oracle教程

    第六章 多表查询 第七章 子查询 第八章 高级查询 第九章 数据字典 第十章 Oracle数据类型 第十一章 Oracle体系结构(DBA) 第十二章 DDL(改变表结构) 第十三章 DML(改变数据结构) 第十四章 约束 第十五章 ...

    21天学会oracle

    第6章 约束.ppt 第7章 视图.ppt 第8章 函数与存储过程.ppt 第9章 游标.ppt 第10章 触发器.ppt 第11章 序列.ppt 第12章 用户角色与权限控制.ppt 第13章 Oracle数据类型.ppt 第14章 Oracle中的函数与表达式.ppt 第15章...

    量具的使用方法

    第六章 角度量具 40 一 万能角度尺 40 二 游标量角器 41 三 万能角尺 42 四 带表角度尺 42 五 中心规 43 六 正弦规 43 七 车刀量角台 45 第七章 水 平 仪 47 一 条式水平仪 47 二 框式水平仪 48 三 光学合像水平仪 ...

    SQL语句大全(程序设计、视图、索引、游标、事务、触发器、锁、存储过程、XML、权限管理……)

    第六章“Sql Server 2005中的XML.sql”可能包含XML数据类型、XML索引、XML方法和XML查询语言XQuery的使用。 10. **权限管理**:权限管理是数据库安全的重要组成部分。第七章“权限管理.sql”将讲解GRANT、REVOKE和...

Global site tag (gtag.js) - Google Analytics