一 游标是什么
qnw
[,_7QM0游标字面理解就是游动的光标。
0N+o5X&@ \5a0用
数据库语言来描述:游标是映射在结果集中一行数据上的位置实体,有了游标,用户就可以访问结果集中的任意一行数据了,将游标放置到某行后,即可对该行数据进行操作,例如提取当前行的数据等。
#_5M9g3^q1X0二 游标的分类
-ou:KIzr0显式游标和隐式游标
51Testing软件测试网A^(A0\oI9e显式游标的使用需要4步:
51Testing软件测试网A:D8|(BI;Z1. 声明游标
51Testing软件测试网"L
lgv8MtL&iCURSOR mycur(vartype number) is
Y1n)E$Rje n7T7m0select emp_no,emp_zc from cus_emp_basic
9g V
up9n3|0where com_no = vartype;
xQE?+Zs&`@02. 打开游标
YoYk}B:Htop0open mycur(000627)
7~'PiT(oF0注:000627是参数
51Testing软件测试网f8b ]S V8L(fn^-t3. 读取数据
BM_|7tC F G0fetch mycur into varno, varprice;
51Testing软件测试网1?m1U
XI;y/b4. 关闭游标
:C^{ G;G!Ca0close mycur;
i:i8Bi,[Z0三 游标的属性
6Oh
f-Z
A0oracle 游标有4个属性:%ISOPEN,%FOUND,%NOTFOUND,%ROWCOUNT。
9h`4J:xS)Q4o+m
?0%ISOPEN判断游标是否被打开,如果打开%ISOPEN等于true,否则等于false;
51Testing软件测试网Q%C*L3}"A Z;{%FOUND %NOTFOUND判断游标所在的行是否有效,如果有效,则%FOUNDD等于true,否则等于false;
51Testing软件测试网[F2~QT
}A}%ROWCOUNT返回当前位置为止游标读取的记录行数。
1q-dbb*gL0四 示例
51Testing软件测试网7qqv~&pmset serveroutput on;
51Testing软件测试网T.OJGEQdeclare
51Testing软件测试网/Y$l;u6g6A u l6J:_varno varchar2(20);
!b.SE4sj;S
WN0varprice varchar2(20);
!J|1m3VMl&m0CURSOR mycur(vartype number) is
V`4j|F$I.S@9N%S0select emp_no,emp_zc from cus_emp_basic
51Testing软件测试网n'eX c Tv4WYwhere com_no = vartype;
51Testing软件测试网x3z-qWd3_*d$Gbegin
jBe)W7j!cE8w7I0if mycur%isopen = false then
|Z%es7H+wiN:t ~z"V0open mycur(000627);
8d7wksg6A0end if;
L8`#k g })hQ0fetch mycur into varno,varprice;
|U,OK!?%{[/f)rds3n0while mycur%found
*a'UL`(RoB0loop
^%P,js0z0dbms_output.put_line(varno||','||varprice);
4}
Z
tEC0if mycur%rowcount=2 then
n(RO;c/X7m X0exit;
'L4Q\w4F#xo/U.R0end if;
-s4Hk
_H0?eB&`0fetch mycur into varno,varprice;
51Testing软件测试网I yx G(e,]Qend loop;
51Testing软件测试网VD,HE#~!T$b0_5J(l3U'?Bclose mycur;
j{R~ZS0end;
%z#b,f&d(uA)S*~9|0PL/SQL记录的结构和C语言中的结构体类似,是由一组数据项构成的逻辑单元。
51Testing软件测试网s9m
~g)VQ pTV @#DPL/SQL记录并不保存在数据库中,它与变量一样,保存在内存空间中,在使用记录时候,要首先定义记录结构,然后声明记录变量。可以把PL/SQL记录看作是一个用户自定义的数据类型。
51Testing软件测试网"vF x7Kx-BMqset serveroutput on;
51Testing软件测试网!A_7g;N$H)R9Vdeclare
8\Y%b/ka4G0type person is record
51Testing软件测试网L
Tq5\8Qh(L3]m(
51Testing软件测试网h,ve3}A3{(["Sempno cus_emp_basic.emp_no%type,
OsM"f0D0empzc cus_emp_basic.emp_zc%type);
H{G"B5Z
m}9r.q0person1 person;
51Testing软件测试网0U)i
i,sl3S?cursor mycur(vartype number)is
51Testing软件测试网/J|mDV*U,aC,uselect emp_no,emp_zc from cus_emp_basic
51Testing软件测试网9_'hT/WP4@~Swhere com_no=vartype;
'RC7ez-c6i4^N0begin
c,p1a,v:h+Y6G0if mycur%isopen = false then
e"WV^w.|0open mycur(000627);
51Testing软件测试网N Nu tF%qW;I'{end if;
51Testing软件测试网$_ J(Ms*H&p.yloop
9?5RG:xNv0fetch mycur into person1;
,q oX'F q$\N%o8A1@7Y3O0exit when mycur%notfound;
51Testing软件测试网R(CH([9wJ#?v Ddbms_output.put_line('雇员编号:'||person1.empno||',地址:'||person1.empzc);
51Testing软件测试网G7At[)k6d#zend loop;
51Testing软件测试网q)pe@Jclose mycur;
51Testing软件测试网 W*L:Y:hT3M Wsend;
P| E,Z*B|0典型游标for 循环
_0Z!F~}h$I1V0游标for循环示显示游标的一种快捷使用方式,它使用for循环依次读取结果集中的行数据,当form循环开始时,游标自动打开(不需要open),每循环一次系统自动读取游标当前行的数据(不需要fetch),当退出for循环时,游标被自动关闭(不需要使用close)。使用游标for循环的时候不能使用open语句,fetch语句和close语句,否则会产生错误。
2@biJ_Tu0set serveroutput on;
D s*m |n(t OE4lF0declare
FN,MKzdqV0cursor mycur(vartype number)is
51Testing软件测试网#[2wjr)TO%XTselect emp_no,emp_zc from cus_emp_basic
51Testing软件测试网2dO;t_k!H
c#^}}where com_no=vartype;
Z-Ed+NN5ih@(xe0begin
SX,TJTF I9vI,},y7n0for person in mycur(000627) loop
51Testing软件测试网V4lF{7^dbms_output.put_line('雇员编号:'||person.emp_no||',地址:'||person.emp_zc);
)y-uJh)r.n0end loop;
51Testing软件测试网#dY/u^j(AzJend;