使用游标
当在pl/sql块中执行查询语句(select)和数据操纵语句时,Oracle会为其分配上下文区,游标是指向上下文区的指针。
pl/sql包含隐含游标和显示游标等两种游标类型,其中隐含游标用于处理select into和DML语句,而显示游标专门用于处理select
语句返回的多行数据。
1.使用显示游标
显示游标包括定义游标、打开游标、提取数据和关闭游标四个阶段
declare open fetch close
(1) 定义游标
语法如下: CURSOR cursor_name IS select_statement;
cursor_name 用于指定的游标名称。
select_statement 用于指定游标所对应的select语句。
(2) 打开游标---当打开游标时,Oracle会执行游标所对应的select语句,并且将select语句的结果暂时存放在结果集中。
语法如下: OPEN cursor_name; 游标名必须是在定义部分已经被定义的游标。
(3) 提取数据---使用fetch语句提取游标数据
2种方式: 语法一 FETCH cursor_name INTO variable1,variable2,......;
语法二 FETCH cursor_name BULK COLLECT INTO collect1,collect2,.........
variable1 用于指定接收游标数据的变量,collect用于指定接收游标结果的集合变量。注意当使用
语法一时,必须要使用循环语句处理结果集的所有数据。
(4) 关闭游标---在提取并处理了结果集的所有数据之后,就可以关闭游标并释放其结果集了。
语法如下: CLOSE cursor_name;
2.显示游标属性---用于返回显式游标的执行信息
语法: 游标名+游标属性 c1%ISOPEN
(1) %ISOPEN 用于判断游标是否打开。
(2) %FOUND 该属性用于检查是否从结果集中提取到了数据。
eg: LOOP
FETCH c1 INTO var1,var2;
IF c1%FOUND THEN
.......
ELSE
EXIT;
END IF
END LOOP;
(3) %NOTFOUND
(4) %ROWCOUNT ---用于返回到当前行为止已经提取到的实际行数。
LOOP
FETCH c1 INTO my_ename,my_deptno;
IF c1%ROWCOUNT >10 then
.......
END IF;
END LOOP;
===========================================================================================
列出部门编号是10的员工姓名。
declare
CURSOR c1 IS select ename from emp where emp.deptno=10;
var_ename varchar2(50);
begin
open c1;
Loop
FETCH c1 INTO var_ename;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line(var_ename);
end loop;
end;
用 fetch bulk collect into 的写法;
declare
CURSOR ename_cursor IS select ename from emp where emp.deptno=10;
TYPE ename_table_type IS TABLE OF varchar(50)『此处不能用%type』;
ename_type ename_table_type;
begin
open ename_cursor;
fetch ename_cursor bulk collect into ename_type;
for i in 1..ename_type.count LOOP
dbms_output.put_line(ename_type(i));
END LOOP;
CLOSE ename_cursor;
end;
============================================================================================================================
当使用fetch...bulk collect into 语句提取数据时,默认情况下会提取结果集的所有数据.如果结果集
含有大量数据,并且使用varray集合变量接收数据,那么可能需要限制每次提取的行数。
下面以每次提取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_line('emp_cursor%rowcount='|| emp_cursor%rowcount);
dbms_output.put_line('v_count='|| v_count);
dbms_output.put_line('雇员名:');
for i in 1..(emp_cursor%rowcount-v_count) Loop
dbms_output.put_line(name_array(i)||' ');
end Loop;
dbms_output.new_line;
v_count:=emp_cursor%rowcount;
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;
当在pl/sql块中执行查询语句(select)和数据操纵语句时,Oracle会为其分配上下文区,游标是指向上下文区的指针。
pl/sql包含隐含游标和显示游标等两种游标类型,其中隐含游标用于处理select into和DML语句,而显示游标专门用于处理select
语句返回的多行数据。
1.使用显示游标
显示游标包括定义游标、打开游标、提取数据和关闭游标四个阶段
declare open fetch close
(1) 定义游标
语法如下: CURSOR cursor_name IS select_statement;
cursor_name 用于指定的游标名称。
select_statement 用于指定游标所对应的select语句。
(2) 打开游标---当打开游标时,Oracle会执行游标所对应的select语句,并且将select语句的结果暂时存放在结果集中。
语法如下: OPEN cursor_name; 游标名必须是在定义部分已经被定义的游标。
(3) 提取数据---使用fetch语句提取游标数据
2种方式: 语法一 FETCH cursor_name INTO variable1,variable2,......;
语法二 FETCH cursor_name BULK COLLECT INTO collect1,collect2,.........
variable1 用于指定接收游标数据的变量,collect用于指定接收游标结果的集合变量。注意当使用
语法一时,必须要使用循环语句处理结果集的所有数据。
(4) 关闭游标---在提取并处理了结果集的所有数据之后,就可以关闭游标并释放其结果集了。
语法如下: CLOSE cursor_name;
2.显示游标属性---用于返回显式游标的执行信息
语法: 游标名+游标属性 c1%ISOPEN
(1) %ISOPEN 用于判断游标是否打开。
(2) %FOUND 该属性用于检查是否从结果集中提取到了数据。
eg: LOOP
FETCH c1 INTO var1,var2;
IF c1%FOUND THEN
.......
ELSE
EXIT;
END IF
END LOOP;
(3) %NOTFOUND
(4) %ROWCOUNT ---用于返回到当前行为止已经提取到的实际行数。
LOOP
FETCH c1 INTO my_ename,my_deptno;
IF c1%ROWCOUNT >10 then
.......
END IF;
END LOOP;
===========================================================================================
列出部门编号是10的员工姓名。
declare
CURSOR c1 IS select ename from emp where emp.deptno=10;
var_ename varchar2(50);
begin
open c1;
Loop
FETCH c1 INTO var_ename;
EXIT WHEN c1%NOTFOUND;
dbms_output.put_line(var_ename);
end loop;
end;
用 fetch bulk collect into 的写法;
declare
CURSOR ename_cursor IS select ename from emp where emp.deptno=10;
TYPE ename_table_type IS TABLE OF varchar(50)『此处不能用%type』;
ename_type ename_table_type;
begin
open ename_cursor;
fetch ename_cursor bulk collect into ename_type;
for i in 1..ename_type.count LOOP
dbms_output.put_line(ename_type(i));
END LOOP;
CLOSE ename_cursor;
end;
============================================================================================================================
当使用fetch...bulk collect into 语句提取数据时,默认情况下会提取结果集的所有数据.如果结果集
含有大量数据,并且使用varray集合变量接收数据,那么可能需要限制每次提取的行数。
下面以每次提取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_line('emp_cursor%rowcount='|| emp_cursor%rowcount);
dbms_output.put_line('v_count='|| v_count);
dbms_output.put_line('雇员名:');
for i in 1..(emp_cursor%rowcount-v_count) Loop
dbms_output.put_line(name_array(i)||' ');
end Loop;
dbms_output.new_line;
v_count:=emp_cursor%rowcount;
exit when emp_cursor%notfound;
end loop;
close emp_cursor;
end;
发表评论
-
Oracle特别函数---First_Value
2009-11-10 14:09 1868FIRST_VALUE 功能描述:返回组中数据窗口的第一个值。 ... -
oracle定时删除表空间的数据并释放表空间
2009-10-13 16:53 2643这两天我一个朋友问我 ... -
oracle定时任务(dbms_job)
2009-10-13 16:50 2316今天总结下oracle的任务队列管理器(job queue ) ... -
Decode函数的语法
2009-10-13 16:47 1025Decode函数的语法结构如下: decode (expre ... -
Oracle 中truncate与delete的区别
2009-10-13 16:27 1038Oracle 中truncate与delete的区别 收藏 ... -
数据库---存储过程总结
2009-10-13 16:20 962定义: ... -
oracle执行计划的理解
2009-10-13 16:12 753执行计划的理解 计信息 ------------------ ... -
oracle定时添加或删除分区表的分区
2009-10-13 16:11 2094这几天,根据业务的需求和性能的考虑,需要定时删除历史数据,表里 ... -
Oracle常用数据字典表
2009-09-16 09:00 1120查看当前用户的缺省表空间 SQL>select us ... -
关于SQL中的“\”的转义
2009-05-30 08:23 969select ename from myemp where e ... -
Oracle存储过程学习(2)
2009-05-11 08:05 1169存储过程创建语法: create or rep ... -
ora-12154 TNS:"无法处理服务名"的一个解决方法
2009-04-13 15:48 1460很怪异的一个问题,在网络环境下配置客户端,竟然怎么也连不上主机 ... -
触发器
2009-02-10 20:27 1031触发器 触发器是指被隐含执行的存储过程,当发生特定事件(例如修 ... -
Oracle 包
2009-02-06 20:08 1239包 包用于逻辑组合相关的PL/SQL类型、项、子程序,它由包 ... -
函数的纯度级别以及使用
2009-02-05 16:09 962函数的纯度级别以及使用 - 定义由函数读取或修改的数据种类。 ... -
管理存储过程和函数
2009-02-05 10:47 754管理存储过程和函数 1.列出当前用户的子程序 SQL>c ... -
Oracle 自定义函数
2009-02-04 14:49 3634函数 函数用于返回特定数据。执行时得找一个变量接收函数的返回值 ... -
Oracle存储过程
2009-02-04 11:05 1055Oracle存储过程 存储过程不仅可以简化客户端应用程序的开发 ... -
PL/SQL DEVELOPER 基本用法详解
2009-02-03 10:37 2388一.编辑表数据(浏览表 ... -
游标(二)
2009-02-02 16:14 842游标FOR循环 游标FOR循环是游标使用的最简单的方式,当使用 ...
相关推荐
Oracle 一次请求执行多条sql语句 在.net 中查询Sql Server 一次请求执行多条sql语句很...例子中提供了2种解决方案 一种是用游标 还有一种就是很简单的拼接字符串的方法 语法略微和sql server有些区别 适合新手学习
在SQL编程中,游标(Cursor)是一种非常重要的工具,特别是在处理多数据库查询时,它允许我们逐行处理结果集,而不是一次性加载所有数据。在标题"利用游标多数据库查询单条数据方法"中提到的场景,游标被用于在10多...
游标在数据库编程中扮演着重要角色,它们允许程序员逐行处理查询结果,而不仅仅是一次性获取所有数据。在数据库管理系统(如Oracle、SQL Server、MySQL等)中,游标是实现交互式数据处理的关键工具。下面我们将深入...
游标图例用来显示图形中的游标,如图1所示。在图形上用游标可读取绘图区域上某个点的确切值,游...右键单击单曲线游标图例,从弹出的快捷菜单中选择“关联至”,可将游标与一个或所有曲线实现关联。多曲线模式将游标
波形图游标功能在许多科学计算和数据分析应用中都是一种非常重要的工具,它允许用户在可视化图形上精确地定位和测量数据点。在LabVIEW(Laboratory Virtual Instrument Engineering Workbench)这样的图形化编程环境...
#### 一、游标简介 在MySQL中,游标是一种数据库对象,主要用于处理存储过程中的结果集。游标允许我们逐行地读取查询结果,这对于需要对每一行数据执行特定操作的情况非常有用。通过使用游标,我们可以实现更加灵活...
在Oracle数据库中,游标是一种非常重要的机制,它允许用户在程序中对查询结果进行逐行处理。游标分为两种主要类型:**隐式游标**和**显示游标**。此外,还可以利用游标进行循环处理,以实现更复杂的数据操作需求。 ...
#### 一、什么是游标? 在数据库技术中,**游标**是一种用于检索查询结果集中的数据的方式。它允许用户逐行处理记录集,而不是一次处理整个记录集。这使得游标成为处理大量数据时的一个非常有用的功能。 #### 二、...
在上面的示例代码中,我们首先声明了一个名为 emp_cursor 的游标,该游标从 emp 表中选择所有列,并使用 FOR UPDATE 选项锁定了 sal 列。在循环体中,我们使用 WHERE CURRENT OF 子句来更新当前行对应的数据行。 7....
游标是 SQL 的一个内存工作区,由系统或用户以变量的形式定义。游标的作用就是用于临时存储从数据库中提取的数据块。在某些情况下,需要把数据从存放在磁盘的表中调到计算机内存中进行处理,最后将处理结果显示出来...
#### 一、游标概述 在深入探讨SQL游标的使用之前,我们先来了解一下什么是游标。游标是数据库管理系统的功能之一,它允许用户逐行处理查询结果集中的数据。通常情况下,当我们执行一个SELECT语句时,整个结果集会被...
在Oracle数据库中,游标(Cursor)是一种非常重要的编程工具,尤其在处理复杂的数据操作时。游标允许我们逐行处理查询结果,这对于迭代、条件判断或者数据更新等任务非常实用。下面,我们将深入探讨Oracle游标的使用...
游标是Oracle数据库中一个重要的概念,它是一种在内存中用于存储SQL查询结果的临时工作区域。使用游标可以方便地访问查询结果集中的每一行,这对于处理大量数据是非常有用的。游标主要分为两种类型:显式游标和隐式...
1. **声明游标**:定义一个游标并关联到一个查询。 2. **打开游标**:使游标准备好读取数据。 3. **从游标中获取数据**:通常使用`FETCH`命令来获取当前行的数据。 4. **循环处理数据**:使用循环结构来依次处理每一...
游标卡尺是一种精密的测量工具,常用于工程和制造业中进行尺寸的精确测量。在三维建模领域,使用SolidWorks这样的专业软件可以创建出游标卡尺的虚拟模型,以便于设计、模拟和分析其结构与功能。SolidWorks 2016是一...
SQL语句通常都可产生或处理一组记录,但是许多应用程序,尤其是T-SQL嵌入的主语言,通常不能把整个结果集作为一个单元来处理,这些应用程序就需要用一种机制来保证每次处理结果集中的一行或几行,游标(cursor)就提供...
游标卡尺是一种常用的测量工具,广泛应用于机械制造、工程设计、建筑施工等领域。下面我们将详细介绍游标卡尺的构造、使用规则、分类、测量原理和读数方法。 一、游标卡尺的构造 游标卡尺由四个部分组成:主尺、...
游标是LabVIEW波形图的一个重要功能,它可以帮助用户精确地读取图形上的数据点坐标,进而进行数据分析或调试工作。本篇将详细解释如何在LabVIEW中操作波形图的游标以及实时显示坐标值。 1. **波形图的创建与数据...
MySQL游标是数据库管理系统中用于遍历查询结果集的一种机制,尤其在处理大量数据或进行迭代操作时,游标显得尤为重要。这篇博文可能是探讨如何在MySQL中使用游标,特别是当游标执行到最后一行后如何正确地结束循环。...