日期:2014-05-16  浏览次数:20542 次

DB2 Old-New-Final-Table中间结果表
DB2底层通过维护事物表,来对表进行添加,更新,和删除操作,这些事物表有:
NEW TABLE,OLD TABLE,FINAL TABLE;他们也叫中间结果表。
当进行insert或update的时候,new table包含着将要添加的数据行或进行更新的数据值;
当进行update或delete的时候,old table包含着将要被更新的值或将要被删除的值。

1、Old Table
“存储”更新或者将要删除的数据,类似于触发器中refferencing old as olddata存储的数据,
Old Table仅限于应用在update和delete操作中。
create table empk(
  empno varchar(6),
  ename varchar(15),
  salary decimal(9,2))
insert into empk 
select empno,lastname,salary 
  from employee 
 order by salary desc 
 fetch first 5 rows only
db2 => select * from empk

EMPNO  ENAME           SALARY
------ --------------- -----------
000010 HAAS              152750.00
000030 KWAN               98250.00
000070 PULASKI            96170.00
000020 THOMPSON           94250.00
000090 HENDERSON          89750.00

下面更新empno为000090的员工薪水,更新的同时,我们想看下他的旧工资。
db2 => select * from old table(update empk set salary=50000 where empno='000090')

EMPNO  ENAME           SALARY
------ --------------- -----------
000090 HENDERSON          89750.00

下面是更新之后的数据:
db2 => select * from empk where empno='000090'

EMPNO  ENAME           SALARY
------ --------------- -----------
000090 HENDERSON          50000.00

当我们删除数据的时候,查看下被删除的数据:
db2 => select * from old table(delete from empk where salary<80000)

EMPNO  ENAME           SALARY
------ --------------- -----------
000090 HENDERSON          50000.00

2、New Table
new table存储新的数据,类似于触发器中referrencing new as newdata存储的新数据值,
仅限于应用在update和insert语句中。
在插入数据的同时我们想看下,新增加的值,但这只能查看新数据,不能像trigger那样对数据进行加工。
db2 => select * from new table(insert into empk values('000050','yeeXun',80000))

EMPNO  ENAME           SALARY
------ --------------- -----------
000050 yeeXun             80000.00
下面这个例子从employee表中取工资对低的3位员工信息,添加到empk表中:
select * from 
new table(insert into empk 
 select empno,lastname,salary 
   from employee
    order by salary asc 
           fetch first 3 rows only)

EMPNO  ENAME           SALARY
------ --------------- -----------
200340 ALONZO             31840.00
000290 PARKER             35340.00
200330 WONG               35370.00
此时的表中数据为:
db2 => select * from empk

EMPNO  ENAME           SALARY
------ --------------- -----------
000010 HAAS              152750.00
000030 KWAN               98250.00
000070 PULASKI            96170.00
000020 THOMPSON           94250.00
000050 yeeXun             80000.00
200340 ALONZO             31840.00
000290 PARKER             35340.00
200330 WONG               35370.00
下面给工资低于800000的员工涨工资,并查看涨工资后的工资:
db2 => selec