`

存储过程——游标基础用法已经重要知识点

 
阅读更多

Oracle游标常用属性:

%FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。

%NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。

%ROWCOUNT:当前时刻已经从游标中获取的记录数量。

%ISOPEN:是否打开

 

--游标使用的几个重要点

使用%ROWTYPE属性可以声明一个基于表或游标的行对象,也称为记录对象

使用FETCH...BULK COLLECT INTO语句提取所有数据
在显式游标中使用FETCH ..BULK COLLECT INTO..LIMIT语句提取部分数据

 

 

使用隐式游标和显式游标:

1.查询返回单行记录时→隐式游标;

2.查询返回多行记录并逐行进行处理时→显式游标

 

--使用%ROWTYPE属性不仅可以基于表和视图定义记录变量,也可以基于游标定义记录变量

declare
CURSOR cur_emp IS SELECT * FROM emp;
row_emp cur_emp%ROWTYPE;
BEGIN
OPEN cur_emp;
FETCH cur_emp INTO row_emp;
WHILE cur_emp%FOUND
LOOP
dbms_output.put_line(row_emp.empno||'----'||row_emp.ename);
FETCH cur_emp INTO row_emp;
END LOOP;

close cur_emp;

END;

 

·注意:1、如果游标打开之前或关闭之后,使用游标属性,Oracle会抛出一个INVALID_CURSOR错误(ORA-01001);

        2、如果在第一次fetch后结果集是空的,%found=false,%NotFound=true,%ROWCOUNT=0;

        3、如果使用了BULK COLLECT,那么%ROWCOUNT的值可能不是0或1,实际上他返回的是提取到相关集合的行数。

--Where Current Of语句允许你更新或者是删除最后由cursor取的记录

--使用显式游标修改数据(给所有的部门经理加薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
emp_row emp_cur%ROWTYPE;
BEGIN
OPEN emp_cur;
LOOP
FETCH emp_cur INTO emp_row;
IF emp_cur%NOTFOUND THEN
EXIT;
ELSE
UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
END IF;
END LOOP;
COMMIT;
CLOSE emp_cur;
END;

 

--游标for循环,这个循环方式很实用(给所有的部门经理减薪1000)
DECLARE
CURSOR emp_cur IS
SELECT empno,ename,sal FROM emp WHERE job='MANAGER' FOR UPDATE;
BEGIN
FOR emp_row IN emp_cur
LOOP
UPDATE emp SET sal=sal-1000 WHERE CURRENT OF emp_cur;
END LOOP;
COMMIT;
END;

 

 

--还有一个游标for循环例子:有点像表结构对象或者理解成一个变量对象

begin

     for employee in (select empno ,ename ,job ,sal from emp where deptno = 20)

 

     loop

         dbms_output.put_line(''}}employee.sal(*每个属性都可以));

     end loop;

end;

 

 

--我们可以看到游标FOR循环确实很好的简化了游标的开发,我们不在需要open、fetch和close语句,不在需要用%FOUND属性检测是否到最后一条记录,这一切Oracle隐式的帮我们完成了。
--给经理加薪5000,其他加薪1000
DECLARE
CURSOR emp_cur IS
SELECT * FROM emp FOR UPDATE;
BEGIN
 FOR emp_row IN emp_cur
 LOOP
 IF emp_row.job='MANAGER' THEN
 UPDATE emp SET sal=sal+5000 WHERE CURRENT OF emp_cur;

 

 ELSE
 UPDATE emp SET sal=sal+1000 WHERE CURRENT OF emp_cur;
 END IF;
 END LOOP;
 END;

 

 

 --这个里面有一个将游标当成java  list 集合的用法(i)来获取对应下标的值
②在显式游标中,使用FETCH...BULK COLLECT INTO语句提取所有数据
DECLARE
CURSOR emp_cursor IS
SELECT ename FROM emp WHERE deptno=10;
TYPE ename_table_type IS TABLE OF VARCHAR2(10);
ename_table ename_table_type;
BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO ename_table;
FOR i IN 1..ename_table.COUNT LOOP
dbms_output.put_line(ename_table(i));
END LOOP;
CLOSE emp_cursor;
END;
/

 

--有oracle 集合的用法

 ③在显式游标中使用FETCH ..BULK COLLECT INTO..LIMIT语句提取部分数据
下面以每次提取5行数据为例,说明使用LIMIT子句限制提取行的方法
DECLARE
TYPE name_array_type IS VARRAY(5) OF VARCHAR2(10);
name_array name_array_type;
CURSOR emp_cursor IS SELECT ename FROM emp;
rows INT:=5;
v_count INT:=0;
BEGIN
OPEN emp_cursor;
LOOP
FETCH emp_cursor BULK COLLECT INTO name_array
LIMIT rows;
dbms_output.put('雇员名');
FOR i IN 1..(emp_cursor%ROWCOUNT-v_count) LOOP
dbms_output.put_line(name_array(i)||' ');
END LOOP;
dbms_output.put_line;//换行
v_count:=emp_cursor%ROWCOUNT;
EXIT WHEN emp_cursor%NOTFOUND;
END LOOP;
END;
/

 

 

分享到:
评论

相关推荐

    oracle内部培训资料——游标

    ### Oracle内部培训资料——游标知识点详解 #### 一、游标概述 游标是Oracle数据库中用于处理SQL查询返回的多行记录的一种机制。它允许用户逐行地访问查询结果,这对于处理不确定数量的数据非常有用。游标分为两种...

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

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

    sql要求大纲及存储过程

    标题中的“sql要求大纲及存储过程”涉及到的是SQL语言的核心组成部分——存储过程,以及如何构建一个有效的学习或项目大纲。SQL(结构化查询语言)是用于管理关系数据库系统的主要工具,而存储过程则是预编译的SQL...

    数据结构与算法——算法、时间空间复杂度、线性表 定义线性表节点的结构.pdf

    数据结构与算法——算法、时间空间复杂度、线性表定义线性表节点的结构 以下是根据给定的文件信息生成的相关知识点:...数据结构与算法是计算机科学的基础知识,掌握了这些知识点可以更好地理解和应用数据结构与算法。

    Android知识点及重要代码合集 word文档

    14.5 简单游标适配器的使用及分页效果的实现 207 15.1对手机通讯录的增删改查 211 15.2查询手机通话记录 221 15.3操作手机短信 224 16.1 自定义内容提供者的编写步骤 226 16.2 如何使当前应用的内容提供者可以被其他...

    Oracle 11g 从入门到精通——第五章(视频教程)

    理解这些基础数据类型和变量的用法,对于编写有效且可靠的PL/SQL代码至关重要。 **第三章:流程控制语句** 此章涵盖条件判断(IF-THEN-ELSIF-ELSE)和循环控制(WHILE、FOR)。掌握这些语句,开发者可以实现复杂的...

    PLSQLDeveloper下载

    /*test_procedure可以省略*/ 至此,test_procedure存储过程已经完成,经过编译后就可以在其他PL/SQL块或者过程中调用了。函数与过程具有很大的相似性,此处不再详述。 编辑本段游标  游标的定义为:用游标来指代一...

    Android部分源码——content包

    理解并熟练运用这些知识点,对于开发能够高效、安全地与其他应用交换数据的Android应用至关重要。通过对这些源代码的学习,开发者不仅可以掌握Android系统的底层工作原理,还能提高编程技巧和解决问题的能力。

    2021-2022计算机二级等级考试试题及答案No.10917.docx

    根据提供的文件信息,我们可以归纳和展开以下几个重要的IT知识点: ### 1. Access 数据库文件的扩展名 **知识点概述:** Access 是微软公司推出的一款桌面型数据库管理系统,它使用多种数据类型来帮助用户构建功能...

    oracle教学7

    ### Oracle 教学知识点梳理 —— 事务、过程、触发器等高级特性 #### 一、事务基础 **事务**是作为单个逻辑工作单元执行的一系列操作,这些操作作为一个整体一起向系统提交,要么全部执行成功,要么全部不执行。...

    PLSQL.pdf,学习oracle必备手册

    这篇“学习Oracle必备手册”——PLSQL程序设计,旨在帮助初学者快速掌握PLSQL的基础知识和应用技巧。 PLSQL是一种结合了SQL和过程编程语言的特性,它允许开发者创建复杂的数据库应用程序。以下是你在阅读这本手册时...

    基础数据库面试题

    【数据库面试题解析】 1. **去除重复列值的关键字**:在SQL查询中,使用`DISTINCT`...这些面试题涵盖了数据库的基础概念、高级特性以及性能优化,对于准备数据库相关职位的面试者来说,理解和掌握这些知识点至关重要。

    2021-2022计算机二级等级考试试题及答案No.11073.docx

    根据给定文件的信息,我们可以总结出以下相关的IT知识点: ### 1. 算法的时间复杂度与空间复杂度 **知识点概述:** - **时间复杂度**:衡量算法运行时间随输入规模增长而变化的增长速率。 - **空间复杂度**:衡量...

    安卓Android源码——db1.rar

    在安卓(Android)系统中,源码是理解其工作原理的关键。"db1.rar"这个压缩包文件很可能包含了与数据库相关的源代码...了解并熟练掌握这些知识点对于Android开发者来说至关重要,能帮助他们构建高效、稳定的应用程序。

    2021-2022计算机二级等级考试试题及答案No.2585.docx

    - **知识点**: 继承性是面向对象编程的一个核心特性,允许子类继承父类的属性、事件和方法。 - **正确答案**: A。继承性使得子类能够重用父类的代码,提高代码复用性和模块化程度。 #### 15. 内容页与母版页关联 - ...

    2021-2022计算机二级等级考试试题及答案No.14782.docx

    根据提供的文档内容,我们可以归纳总结出以下几个重要的知识点: ### 1. Access 数据类型的排序与索引 - **知识点概述**:在Access数据库中,并非所有数据类型都可以进行排序或建立索引。根据题目中的信息,备注...

    db2 开发基础课程

    ### DB2开发基础课程知识点详解 #### 一、DB2简介 - **DB2概述**:DB2是IBM公司开发的一款关系型数据库管理系统(RDBMS),适用于多种操作系统如Windows、Linux、Unix等,并且能够在包括分布式环境在内的各种环境中...

    Testinside 1Z0-144 最新题库

    - **游标操作**:掌握游标的使用方法及其应用场景。 - **触发器**:了解触发器的工作原理以及如何编写触发器。 - **安全性与权限管理**:熟悉Oracle 11g数据库的安全性和权限管理机制。 #### 题库特点 - **完整的...

Global site tag (gtag.js) - Google Analytics