oracle的游标

来源:互联网 发布:部落冲突七本满防数据 编辑:程序博客网 时间:2024/05/17 16:53
                               游标
声明游标:declare cursor (声明游标) 游标名 is select语句
打开游标:open 游标名
读取数据:fetch 游标名 into 变量列表
关闭游标:close 游标名   
可以声明一个行类型变量: 变量名 游标名%rowtype 或表名%type
取出一条记录
declare 
mz a.xm%type;--声明变量
nv a.xb%type;--声明变量
cursor cus1 is select xm,xb from a where bj='你好';--建立游标
begin
open cus1;--打开游标
fetch cus1 into mz,nv;--读取数据
dbms_output.put_line('姓名:'||mz||'性别:'||nv);--输出数据
close cus1;--关闭游标
end;


取出多条记录
declare 
cursor cus1 is select xm,xb from a ;--声明游标
cus2 cus1%rowtype;--声明变量
begin
if not cus1%isopen then --如果游标没有打开,就执行打开游标
open cus1;
end if;
fetch cus1 into cus2;--取出第一条记录
while cus1%found loop --循环条件为cus1不为空
dbms_output.put_line('姓名:'||cus2.xm ||'   性别:'||cus2.xb);
fetch cus1 into cus2;--取出下一条记录
end loop;
dbms_output.put_line('总行数:'||cus1%rowcount);--输出总行数
close cus1;
end;


使用bulk collect 和for 语句的游标, fetch bulk collect into批量提取数据
前面都是一样的循环不一样
loop
fetch cus1 bulk collect into cus2 limit 3;--批量取出3条记录
for i in 1..cus2.count loop;
dbms_output.put_line('输出数据:'||cus2(i).xm);
end loop;
exit when cus1%notfound;--当没有数据就退出
end loop;


for  loop 语句 没循环一次,游标会自动下移取出下一行数据,不用读取数据。也不用打开游标,也不用关闭游标,但他不能记录总行数
cus_count integer:=0;--定义一个变量,用来存储总行数
for cus2 in cus1 loop;--自动下移,指向下一条记录
dbms_output.put_line('输出数据:'||cus2(i).xm);
cus_count=cus_count+1;
end loop;
dbms_output.put_line('输出总行数'||cus_count)


为游标传递参数 (在游标名后面加一个参数)如下
declare 
cursor(cs integer)cus1 is select xm,xb from a ;--声明游标给了一个参数


显式游标的属性
%isopen : 判断游标是否打开,打开为真,否则为假
%found: 判断游标最近一次fetch是否取到数据,若是为真
%notfound: 与%found相反
%rowcount:判断游标打开以来,用fetch命令获得的总行数


强类型动态游标
声明动态游标:type 游标名 is ref cursor  return 记录类型
打开游标: open 游标变量 for  select语句
如 declare
type yb1 is cursor return 表名%rowtype
yb2 yb1;--定义游标变量
c_count number;



原创粉丝点击