a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 108|回复: 1

[其他] Oracle认证:Oracle游标使用经验总结

[复制链接]
发表于 2012-8-4 13:41:06 | 显示全部楼层 |阅读模式
显示游标(Explicit Cursor):在PL/SQL程序中定义的、用于查询的游标称作显示游标。
6 c/ E+ T- C  Q) t! Q: J    隐式游标(Implicit Cursor):是指非PL/SQL程序中定义的、而且是在PL/SQL中使用UPDATE/DELETE语句时,Oracle系统自动分配的游标。! J. H8 a0 t5 g* L
    一。显示游标
4 x9 s+ c& c5 y& Y    1.使用步骤, q" G8 ?( N8 h2 v
    (1)定义 (2)打开 (3)使用 (4)关闭
0 y: d8 M  o0 a' k    2.使用演示
5 i; ]% B/ K* X$ }& p' x" o    首先创建测试用表STUDENT,脚本如下:
( \$ {! x4 O8 f    复制代码 代码如下:0 X+ M, l3 C$ e; s) A8 I& J' b
    CREATE TABLE "STUDENT" (
) C# B  j2 H  s9 p    "STUNAME" VARCHAR2(10 BYTE),) Y9 w9 b' u4 A; m6 d6 ]) T
    "STUNO" VARCHAR2(4 BYTE),- e1 K1 e+ H; h! X
    "AGE" NUMBER,
+ p, n: B2 D* B! V8 a1 x    "GENDER" VARCHAR2(2 CHAR)" n& D  e# b1 V( h% x  h
    )9 T  O- `7 j% C+ b' `/ q- d
    (1)。使用WHILE循环处理游标; Q9 u) H7 w. v* N$ R5 a
    create or replace PROCEDURE PROC_STU1 AS4 Q* v. N( p$ U! W% E
    BEGIN
2 I4 |9 N$ ^; H+ w6 @0 K" ~    --显示游标使用,使用while循环
* q, Q) y. D  L9 D& O. q8 W    declare
1 y0 _+ ~) e3 r, m7 r& R$ a    --1.定义游标,名称为cur_stu
% |7 l3 g6 d5 H, N$ ?    cursor cur_stu is
; y/ u$ l& ^( P0 }    select stuno,stuname from student order by stuno;
! t) Q) F$ ?! d, Y' L    --定义变量,存放游标取出的数据
* x5 L, n$ ?& Y! i7 P    v_stuno varchar(4);
' H& Z2 K7 R: w+ ?& P9 G) U7 n    v_stuname varchar(20);
# K# q5 Z" Q+ D# v    begin3 V. A4 M* K7 M2 b5 \  V
    --2.打开游标cur_stu
1 |0 b5 o; b' f: {% K    open cur_stu;/ L1 f2 ]7 g9 t' a1 Y
    --3.将游标的当前行取出存放到变量中
- X1 _. T( W( b) W" K7 b    fetch cur_stu into v_stuno,v_stuname;  [% V; G8 \0 m- N
    while cur_stu%found --游标所指还有数据行,则继续循环8 g! j' o* s8 Z1 u
    loop
* B* I! t2 R% X$ D! F    --打印结果, w# U) [: d  T+ _
    dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);
" \. Q# j$ \( u1 u& s, q* c4 e    --继续将游标所指的当前行取出放到变量中
1 P. P) o& a) ?. P) b1 [    fetch cur_stu into v_stuno,v_stuname;
8 I+ V. ?7 j" z2 y" s    end loop;! u. w( o0 N- G3 g" E" f  C/ E
    close cur_stu; --4.关闭游标) j, b7 I; N+ g. v6 e$ W/ A
    end;
' X2 U; {- M, F  {+ r    END PROC_STU1;
回复

使用道具 举报

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

Oracle认证:Oracle游标使用经验总结

(2)。使用IFELSE代替WHILE循环处理游标( e0 {2 ~: D4 G1 x
    create or replace PROCEDURE PROC_STU2 AS* n* l0 m7 \4 q! I* ~4 U4 t2 @
    BEGIN" X  x$ P4 G  F) J
    --显示游标使用,使用if判断
0 B/ O3 b5 L! [) w    declare+ S' ?- V( y  t  b, f7 J
    --1.定义游标,名称为cur_stu+ p' m% m( R8 [5 Q4 g, b
    cursor cur_stu is
1 K% B& |/ F2 ^+ _& T% k1 V- A2 a# p    select stuno,stuname from student order by stuno;9 I# t+ v# Y9 s/ b) d8 S( q
    --定义变量,存放游标取出的数据
  `, A  {3 f( z3 A, E    v_stuno varchar(4);: T. g/ l1 P6 a6 E2 ^% p
    v_stuname varchar(20);, \0 W0 ]/ ]3 k. t, P
    begin
* D* s  K& {% \    --2.打开游标cur_stu" t" F1 [- Z/ _' W
    open cur_stu;& r# ^& |. H$ T5 K- Y: w+ Y( a% s
    --3.将游标的当前行取出存放到变量中$ ]  W6 n/ l, _  \6 O5 }! w- U
    fetch cur_stu into v_stuno,v_stuname;
' W4 Z0 t7 X4 c% A1 W" }* X    loop
' K( d7 X0 Q; J+ N( q    if cur_stu%found then --如果游标cur_stu所指还有数据行
) F- q) c! |" y% w, K    --打印结果
- k1 O8 A3 M8 K" h  V" H    dbms_output.PUT_LINE(v_stuno||'->'||v_stuname);# F. [( H6 x6 g# S
    --继续将游标所指的当前行取出放到变量中$ l! V* t, N, P) X2 l$ Z6 u) p
    fetch cur_stu into v_stuno,v_stuname;# e; J' l/ q( R' T9 D1 e
    else, o8 ]( |1 ?, |+ o
    exit;
0 |2 M) ]8 n9 C/ Z7 N% [    end if;3 c6 `" y2 w& S# X! E. O8 `# D6 z
    end loop;* d( ?' n, U, `0 f( [5 D4 @8 y: L
    close cur_stu; --4.关闭游标" K- J1 K% I/ u3 [
    end;
) ?: y% G0 [  B2 L& \5 h  S3 J    END PROC_STU2;7 j3 e/ K5 [$ M! e6 E$ q0 Y
    (3)。使用FOR循环处理游标$ f) R5 v  I+ V- G7 H; B' Z9 a
    create or replace PROCEDURE PROC_STU3 AS
: I7 }5 ]3 i2 P  w+ |  _    BEGIN1 R: T% ]: S: r3 A; G. U2 M. p, q4 v
    --显示游标使用,使用for循环
- h- h* a5 x& Q8 p/ G) j' l. B    declare4 g& A  d6 _: `. _
    --定义游标,名称为cur_stu8 |, r" b7 E% R  |1 a5 U9 s
    cursor cur_stu is
2 z+ W) F5 r& ?    select stuno,stuname from student order by stuno;
4 u' E' S# q, `  }    begin  E5 i: I, X2 _  x
    for stu in cur_stu3 z& I% _8 ?6 `5 R9 f
    loop8 J% q5 I- I8 x" s  B
    dbms_output.PUT_LINE(stu.stuno||'->'||stu.stuname);
; W# }# B! j7 K5 N" c! ~. X    --循环做隐含检查 %notfound
) n8 r0 \' _$ I! ~% a, |2 O5 a    end loop;+ p% B2 P" ]( u! N6 ?4 g  W
    --自动关闭游标" C- P) [$ i9 }& l
    end;2 L7 i; X# |7 h7 o3 E
    END PROC_STU3;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 16:32 , Processed in 0.185983 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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