a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 141|回复: 1

[综合] Oracle综合辅导:在Oracle9iRelease2中使用PL/SQL的集合增强

[复制链接]
发表于 2012-8-4 13:54:49 | 显示全部楼层 |阅读模式
Oracle Release 2提供对PL/SQL集合的增强,它可以通过以前的发布版本进行代码维护。例如,你可以在Release 2中将PL/SQL集合用作一个单一的参数,从而避免了使用一长串的域作为参数。
; F& ]/ U0 W0 E  V4 ?- z  F4 v  
8 Y# s8 ^/ {/ a& C' q+ x  另外一个优点是记录的集合现在可以是BULK COLLECTION INTO子句的目标。在Release 2以前,我们必须为返回的每个列创建一个集合。例如:
$ y2 @  I) T! i' d8 s. F5 w7 h( C6 J  2 Q  _6 E/ m+ _8 g# @& f
  Declare, X( P- {4 T$ ?+ \
    type deptno_coll is table of dept.deptno%type;
# D/ `& p+ z1 X    type dname_coll is table of dept.dname%type;0 Q3 E( \& W9 I" U+ v: F8 p' I
    type loc_coll is table of dept.loc%type;2 v$ J; o! q5 a" h4 J
    deptno_listdeptno_coll;% h6 Q7 K* g7 N
    dname_listdname_coll;
+ P: d' Q8 J+ E/ H0 Z* Z    loc_listloc_coll;
0 o% T3 ?" B! ], R; b  begin
1 k. n0 k5 \# N# w  b: w4 P# q    select * bulk collect into deptno_list,dname_list,loc_list from dept;0 D; _$ _. N) M
  end;
3 x5 l" H! X; k6 ^- h6 ^8 N  
4 z0 O1 [: \  k! l* y% J  在Release 2中,可以用下面的代码实现同样的功能:
' i$ \" L. L. L0 }/ J5 Q  
9 |1 ]0 U) g) w% k: E3 m: r  Declare
- W" l! g9 |: |% R6 K    type dept_coll is table of dept%rowtype;1 J) E! l( j5 d1 E: T& u6 @8 _: ?
    dept_listdept_coll;
0 p5 N% P- J/ C8 E7 d1 |1 I  begin3 |; B& S& R9 Y* t
    select * bulk collect into dept_list from dept;
4 m) q8 g! [# u- r8 n3 u' O  end; 4 r7 L0 V  y0 t/ w# A
  - E1 C5 I) Y3 j7 x2 h2 m
  注意这里不再有对列名的引用。如果DEPT表的列的个数或者名字被修改,你也不需要对第二段示例代码进行改动。这段代码还比旧版本易于维护。然而,应用程序需要一个Release 2数据库来编译。, S$ L* D' j" m8 V; d, x
  
6 s- f2 X9 a  |2 M, g3 ^* R& L  现在你可以使用记录以集合方式将一行数据插入到一个表中。在Release 2之前,你必须插入到表中一个PL/SQL记录然而再单独地确定每一列,作法如下:
+ j9 x& I& t9 m; g8 _7 {1 _  1 E6 w# _3 F+ `- z" ?2 t# Z
  Declare) p1 I3 B; M% H
    dept_rowdept%rowtype;- G6 p0 M$ H2 O" J5 i1 F$ X
  begin/ H; H5 Y  ?% Y6 @: Q5 o( A' e* m
    /* populate dept_row . . . */2 x3 P; [2 Y/ Z/ ?4 @+ l
    insert into dept values (dept_row.deptno,dept_row.dname,dept_row.loc);8 T5 r1 \4 ~* b0 t6 |1 K! q
  end; ; O. a- e' V; h; ]5 e( P7 x
  - x% }1 |7 [$ c( ^8 H
  
回复

使用道具 举报

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

Oracle综合辅导:在Oracle9iRelease2中使用PL/SQL的集合增强

而在Release 2中你可以将插入语句简化为如下的语句:/ _9 Z" s- P) I8 W; n4 H, i
  
& _9 X3 v4 i% e' N. b* X    insert into dept values dept_row; 1 U) B( Z/ `) f
  * h. F. N. G9 p. c/ p8 H5 a
  记录可以以集合方式更新一个表中的数据。像插入语句一样,你以前必须单独地更新每一列:) Q( E( g/ G( s2 F4 b$ {* o3 @2 R
    update dept3 d/ ^4 A0 `1 e
      set deptno = dept_row.deptno,
8 o1 N+ D: |$ Z        dname = dept_row.dname,$ F( Z% L3 p3 d6 e0 C5 S
         loc = dept_row.loc
1 \# g: a" B2 W9 j( R' d9 K     where deptno = dept_row.deptno;
- F0 `/ W8 z9 {" W" O- x; o9 t  
/ Y. n9 X/ ], {1 g8 x% R# n  而在Release 2中,你可以根据在记录中的位置来更新整条数据:% M% I/ Q1 {8 r5 d( Y
  
+ M" e' P  Y. C- A    update dept set row = dept_row where deptno = dept_row.deptno;
, |# a4 q( R, J* g; P  
! _) k, T* a  ^8 Y* U, O1 k  (注意“SET ROW”是一个新子句。)4 C9 T) `! ?; [6 v, d; c( T
  
! I# }) l  @- s! a, Y1 f+ w+ k3 V  你可以使用记录从DML语句的RETURNING子句中提取信息。通常在更新数据的时候保持一个本地副本以备后面的PL/SQL操作会比较有用。在Release 2以前,我们可以在计算和调用完成之后使用RETURNING子句将数据存储到某个地方。而在Release 2中,你可以把数据存储到一条记录中。例如,下面是Release 2之前的作法:% s/ J! f3 v6 ?1 Q! q- i. u
  8 A! _) V- d5 x+ `& \9 D# \4 F# E
  Declare
, G( K2 \+ o- Q( b    foorowfootab%rowtype;& Y+ y% w0 F, z/ \
  begin
1 W$ Y& O6 F# c0 @% j; C# ^, {    insert into footab (foono,fooname) values (fooseq.nextval,'Foo')
8 i$ @0 [$ @' K6 ~# G4 p0 O" E     returning foono,fooname into foorow.foono,foorow.fooname;
. ]' k: F) n) x5 ~, U( g' w  end;
6 o( v6 x( r% ~- ^' d! r8 n  
: T: k! `+ c- O  而现在你可以把插入语句简化为:# m8 J, F$ G) v" D6 B2 y6 ?. }, M
  
4 c: H2 Z( j" a+ g+ @    insert into footab (foono,fooname) values (fooseq.nextval,'Foo')
/ t# K, q8 o" j% @! l3 w  [3 {      returning foono,fooname into foorow;
, I, z" v# T5 l  M  
9 Q& f. L$ p9 S2 Z/ i) r  这些增强使得语法更加易读,并能帮助我们避免由于在返回语句中将表匹配错误所引起的程序错误。但是要记住这些增强要依赖于表和记录中第一列的物理位置。如果一个表的列的位置发生改变,那么列的顺序也会改变。因此,在一个数据库表中使用ROWTYPE匹配列比显式地列出列名要好。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 17:38 , Processed in 0.183509 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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