游标(一)

使用游标
当在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;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值