a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 122|回复: 2

[综合] Oracle辅导:浅谈关于ORACLE中的游标Cursor总结(1)

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
游标(Cursor):用来查询数据库,获取记录集合(结果集)的指针,可以让开发者一次访问一行结果集,在每条结果集上作操作。   游标可分为:+ J+ O( G  c6 P) B9 s
  1.静态游标:分为显式(explicit)游标和隐式(implicit)游标。% z3 @( ?9 H0 v, G1 P0 T6 E
  2.REF游标:是一种引用类型,类似于指针。' Y. Y2 o4 \* P( G$ v" l/ [
  1、静态游标
* q0 g4 a/ \6 i6 X2 i$ ]9 W  1.1显式游标
( E5 a8 Z; G. p. F9 t- `6 g  定义格式:! S" c" w& N, i6 S
  CURSOR 游标名 ( 参数 )  IS
7 H! r9 M3 m- X  Select 语句 FOR UPDATE [OF [schema.]table.column[,[schema.]table.column]..
9 j/ F  u; ?, j6 Y* L  [nowait]
6 q7 ~2 L, s/ {* b( f9 W; U  例子1 :无参数,打开关闭游标9 u2 u1 I% y) ]' y1 R
  set serveroutput on size 10000000 ;
6 I! s7 p. H8 f- P0 U  create or replace procedure TEST is
* F+ H; D" e7 E! V# @2 ~. V* c6 t  cursor c1 is, J+ [, f; o( f! E8 J2 k
  select tname from tab;) Y& ?/ Q& b+ _  P
  pname varchar2(32);# ^1 }) K# a2 I  X& C* H6 y
  begin
. }3 a" ]3 E0 }  open c1;
- E! B( Q" V; G, a, Q6 |  loop& h% L0 N# T; r+ h, t: `, H1 j
  fetch c1: O' n1 L( @+ S# g" W
, G% m% ?9 p2 P, Z6 V" [8 M
  into pname;
回复

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:50 | 显示全部楼层

Oracle辅导:浅谈关于ORACLE中的游标Cursor总结(1)

</p>  exit when c1%notfound;
/ v: b8 M! h0 n8 Z) P  i  dbms_output.put_line(pname);8 ~; u5 @: \& `/ V6 ?% J5 ]& Y
  end loop;
9 f; w# P7 [5 A* w  close c1;
: R2 X+ {3 l: M: @* d% {+ B  end TEST1 p3 o% k- n* l. c, \( B. P
  exec test;
4 r5 v. Z+ @2 L3 v8 Y* w5 w! c  例子2 :参数使用,参数使用方法和存储过程一样
% Q% J! w- J. k3 |0 w( R  create or replace procedure TEST is
1 v5 b* S) _  }+ v& l  cursor c1(pname in varchar2) is% I" e& |) r6 x# Y/ _! _
  select tname from tab where tname like pname;# O& \$ x# t7 d) q- P
  pname varchar2(32);
) M8 P( }" W4 L1 D0 `8 k  begin9 y) q# b7 I! [' O# }
  open c1('T%');
3 G1 f; h6 k1 L" Y9 K; ]  ~. C  loop
  G# Y* w+ U# W* S: e  fetch c1' {8 V! Z. k. ~  q. o$ Z: ~" o( }
  into pname;2 b0 |1 P, ~9 ]
  exit when c1%notfound;* q/ f& ^. S0 L* i1 S7 ?' c: q
  dbms_output.put_line(pname);
/ r! t. F; m% ?9 [& P8 l  V  end loop;9 _2 G( R3 h( a- N/ h2 i( _
  close c1;. Y6 L  o! x* g1 f
  end TEST;/ A  u- b2 p$ O/ D* D8 X
  1.2隐式游标6 F% ]7 J& \: ?* B3 m0 m; y5 |
  不用明确建立游标变量,分两种:: ^& F+ f9 G7 L7 k; \; v# s3 \
  1.在PL/SQL中使用DML语言,使用ORACLE提供的名为“SQL”的隐示游标。
- D- c! ~' N0 W; F( U8 D' t# z  举例:' q0 _5 W! G' u, V3 y% Z
  declare- e, i: d5 }7 s' |5 j7 [7 J
  begin
3 d5 ?* |% j8 T; I  update departments set department_name = department_name;9 B& m' H! K& m4 h+ F& e/ w3 E
  --where 1=2;
2 @- y+ O6 A1 n  dbms_output.put_line('update ' || sql%rowcount || ' records');
$ k. [/ t/ {) @9 G  end;
0 y0 u. |+ \9 k# \/ A! f, J; @3 |: }/ B  /* l: ~6 s2 H( O# x3 e4 ]$ J& _7 a
  2.CURSOR FOR LOOP,用于for loop 语句
& e/ A# U! c! Y2 w* p9 r2 C. V  举例:
: ]6 [# S/ H  A0 ^  例子1:无参数,使用循环,无须打开关闭,本人这种方式) m7 S7 L6 ^& F) B
  create or replace procedure TEST is
( H5 j5 q- U0 `' c0 _2 v. D& G  cursor c1 is8 x6 w: l( W( K: _
  select tname from tab;$ _, Y" n) P3 ?: R* ]* V! W* j
  begin" g2 D5 j; C7 R) e, q* s
  for rr in c1 loop
5 q/ C, J' V. x& o, [9 Y8 L4 ~/ k: H  dbms_output.put_line(rr.tname);
( T3 G) X0 }/ f+ Y( j0 Q! Q: h9 }9 R0 b
  end loop;
回复 支持 反对

使用道具 举报

 楼主| 发表于 2012-8-4 13:54:51 | 显示全部楼层

Oracle辅导:浅谈关于ORACLE中的游标Cursor总结(1)

</p>  end TEST;7 g  [9 Q3 T  J7 \4 V
  例子1:有参数,使用循环,无须打开关闭,本人这种方式
: b0 e7 u: f9 _0 b5 m& T9 Q! W. }  x  create or replace procedure TEST is# B1 Q% L6 x" S+ l
  cursor c1(pname in varchar2) is
( l$ q7 J1 ?. ~2 l9 A* b  select tname from tab where tname like pname;6 X' I" a4 N8 B) z! k  a
  begin
+ q- u" K' y1 l  for rr in c1('T%') loop, K" a" i7 C1 d! F
  dbms_output.put_line(rr.tname);1 ^$ _2 G+ Q) Z  o
  end loop;( e7 K" C$ v2 u# O$ w7 n, i  y6 M! w
  end TEST;& {- P; x4 \, K0 M$ _6 k3 [
  1.3游标常用属性:8 J! j# j$ V! M: G, g' o
  %FOUND:变量最后从游标中获取记录的时候,在结果集中找到了记录。. r( X/ K6 Y% G" Z4 l6 o% {
  %NOTFOUND:变量最后从游标中获取记录的时候,在结果集中没有找到记录。
4 |$ T  s% n! D) U2 c! G; e  %ROWCOUNT:当前时刻已经从游标中获取的记录数量。, Z6 g4 k  d7 K- |
  %ISOPEN:是否打开。2 X; {' f- o$ Q1 X# F
  Declare  /* /* 定义静态游标 */ */
3 t8 K! Z% }# n! `. O! M  Cursor emps is1 v' {$ G  N; _- U4 t" R( y# M
  Select * from employees where rownum < 6 order by 1;) J. z) v/ i1 ], u& c' |, E
  Emp employees%rowtype;
+ X, K- D' i8 Q  Row number := 1;; f5 t, C4 g( H0 C
  Begin
, L/ [/ m% O( y4 |; n: s  Open emps; /* ?打开静态游标 */
; `2 R+ a( p. G- Z: G# X  Fetch emps; v5 O8 ~7 u/ d& O! B7 j' x
  into emp; /*  读取游标当前行  */  J  p& s0 E# a! X* v& K! P
  Loop& U+ k* N3 D0 }8 }4 O8 v7 R
  If emps%found then
1 ]1 s' a( b" F5 m) E  Dbms_output.put_line('Looping over record ' || row || ' of ' ||
# _2 _( ~  p* j7 h8 m1 o  emps%rowcount);
6 X+ ?7 z4 l5 h  Fetch emps
4 O( N/ y: \9 k- U, M* k8 }' i" d  into emp;% Q4 [- D. o% t! |( i: {
  Row := row + 1;
& J, \. R% h# h& Y) V  Elsif emps%notfound then. c3 x2 q1 Z5 q8 @, ^
  Exit;
5 X! U  n3 w+ s9 N  q  End if;: K; y9 D# k/ }* }
  End loop;
; @2 a& }* r" ~5 v3 h  If emps%isopen then" W+ x6 o! U( P, E5 X; S0 k
  Close emps; /*  关闭游标  */
/ I; l. I- p9 n- D) U1 I6 x7 r8 B  End if;
& [' j7 s0 j; G: g7 O& z  End;" B& i; l( i, a: y0 S" a' H
  /
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-16 03:04 , Processed in 0.378672 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表