而在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匹配列比显式地列出列名要好。 |