/*
游标的使用
*/
--1.简单的输出,不带参数
declare v_name tbyszz.tbyszz_zzmc%type;
v_zznm tbyszz.tbyszz_zznm%type;
v_zztype tbyszz%rowtype;
cursor myCursor is select * from tbyszz;
Begin
open myCursor;--打开游标
fetch myCursor into v_zztype;
while myCursor%found loop
dbms_output.put_line(v_zztype.tbyszz_zznm);
fetch myCursor into v_zztype;
end loop;
close myCursor;
End;
--2.游标参数的传递方法
declare v_name tbyszz.tbyszz_zzmc%type;
v_zznm tbyszz.tbyszz_zznm%type;
v_zztype tbyszz%rowtype;
cursor myCursor1 is select * from tbyszz;
cursor myCursor2(v_para_zznm tbyszz.tbyszz_zznm%type default '00000000') is select * from tbyszz where tbyszz_zznm=v_para_zznm;--华丰集团
Begin
--游标1
open myCursor1;
loop --循环游标可以采用循环的三种方式 whiel和loop
fetch myCursor1 into v_zztype;
exit when myCursor1%notfound;
dbms_output.put_line('游标1:组织名称 '||v_zztype.tbyszz_zzmc);
end loop;
close myCursor1;
--游标2,带有一个默认参数,结果应该是华丰集团
open myCursor2;
fetch myCursor2 into v_zztype;
while myCursor2%found loop
dbms_output.put_line('游标2:组织名称 '||v_zztype.tbyszz_zzmc);
fetch myCursor2 into v_zztype;
end loop;
close myCursor2;
--重新打开游标2,赋值一个参数,00000002,得到的应该是销售合并公司
open myCursor2('00000002');
fetch myCursor2 into v_zztype;
while myCursor2%found loop
dbms_output.put_line('带参数的游标2:'||v_zztype.tbyszz_zzmc);
fetch myCursor2 into v_zztype;
end loop;
close myCursor2;
End;
--执行结果
/*
游标1:组织名称 华丰集团
游标1:组织名称 销售合并公司
游标1:组织名称 集团本部
游标1:组织名称 山东区域
游标1:组织名称 潍坊分公司
游标1:组织名称 泰安分公司
游标1:组织名称 抵销公司
游标1:组织名称 hf1
游标1:组织名称 xs1
游标1:组织名称 wf1
游标1:组织名称 jt1
游标2:组织名称 华丰集团
带参数的游标2:销售合并公司
*/
--游标的属性
/*
Cursor_name%FOUND 布尔型属性,当最近一次提取游标操作FETCH成功则为 TRUE,否则为FALSE;
Cursor_name%NOTFOUND 布尔型属性,与%FOUND相反;
Cursor_name%ISOPEN 布尔型属性,当游标已打开时返回 TRUE;
Cursor_name%ROWCOUNT 数字型属性,返回已从游标中读取的记录数
*/
declare v_zznm tbyszz.tbyszz_zznm%type;
v_zzmc tbyszz.tbyszz_zzmc%type;
v_zztype tbyszz%rowtype;
cursor myCursor is select * from tbyszz;
Begin
open myCursor;
loop
fetch myCursor into v_zztype;
exit when myCursor%notfound;
dbms_output.put_line('组织名称:'||v_zztype.tbyszz_zzmc||' 记录数:'||myCursor%rowcount);
end loop;
close myCursor;
End;
--基于游标的变量比记录更好使,不容易出错
declare
cursor myCursor is select tbyszz_zznm,tbyszz_zzmc from tbyszz;
v_zztype myCursor%rowtype;--基于游标的变量
Begin
open myCursor;
loop
fetch myCursor into v_zztype;
exit when myCursor%notfound;
dbms_output.put_line('名称:'||v_zztype.tbyszz_zzmc);
end loop;
close myCursor;
End;
--游标的For循环,自动执行Open,fetch,检查,Close操作
/*
PL/SQL语言提供了游标FOR循环语句,自动执行游标的OPEN、FETCH、CLOSE语句和循环语句的功能;当进入循环时,游标FOR循环语句自动打开游标,并提取第一行游标数据,当程序处理完当前所提取的数据而进入下一次循环时,游标FOR循环语句自动提取下一行数据供程序处理,当提取完结果集合中的所有数据行后结束循环,并自动关闭游标。
格式:
FOR index_variable IN cursor_name[(value[, value]…)] LOOP
-- 游标数据处理代码
END LOOP;
其中:
index_variable为游标FOR 循环语句隐含声明的索引变量,该变量为记录变量,其结构与游标查询语句返回的结构集合的结构相同。在程序中可以通过引用该索引记录变量元素来读取所提取的游标数据,index_variable中各元素的名称与游标查询语句选择列表中所制定的列名相同。如果在游标查询语句的选择列表中存在计算列,则必须为这些计算列指定别名后才能通过游标FOR 循环语句中的索引变量来访问这些列数据。
注:不要在程序中对游标进行人工操作;不要在程序中定义用于控制FOR循环的记录。
*/
declare cursor myCursor is select tbyszz_zzmc,tbyszz_zznm from tbyszz;
v_zztype myCursor%rowtype;
Begin
for v_zztype in myCursor loop
dbms_output.put_line('名称:'||v_zztype.tbyszz_zzmc);
end loop;
End;
--游标For循环中使用子查询
Begin
for myCursor in (select tbyszz_zzmc from tbyszz) loop
dbms_output.put_line(myCursor.Tbyszz_Zzmc);
end loop;
End;
--
select lpad(tbyszz_zzbh,40,'0') from tbyszz;
Oracle游标
最新推荐文章于 2023-03-19 17:22:30 发布