程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> DB2數據庫 >> DB2教程 >> DB2 Old-New-Final-Table中間結果表

DB2 Old-New-Final-Table中間結果表

編輯:DB2教程

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 => select * from new table(update empk set salary = salary * 1.2 where salary < 80000)   EMPNO  ENAME           SALARY ------ --------------- ----------- 200340 ALONZO             38208.00 000290 PARKER             42408.00 200330 WONG               42444.00   3、Inlcude 如果我們在更新一條數據的同時,想同時查看舊數據(更新之前)和新數據(更新之後), 根據上面講到的new table和old table,我們可以使用兩個語句查看,如: select salary from old table(update empk set salary=salary*1.1 where empno='200330') union all select salary from new table(update empk set salary=salary*1.1 where empno='200330') 然而,當執行此語句的時候,我們會得到如下的錯誤信息: SQL20165N  在指定 SQL 數據更改語句的上下文中,不允許 FROM 子句中的 SQL數據更改語句。SQLSTATE=428FL   include關鍵詞可以解決此問題,在更新數據的時候,可以同時把新舊數據查詢出來,下面是實例:   select empno,salary as new_salary,old_salary    from new table( update empk include(old_salary decimal(9,2))   set salary=salary*1.1,        old_salary=salary  where empno='200330')   EMPNO  NEW_SALARY  OLD_SALARY ------ ----------- ----------- 200330    46688.40    42444.00   1 條記錄已選擇。   表中的數據也是如此: db2 => select * from empk where empno='200330' EMPNO  ENAME           SALARY ------ --------------- ----------- 200330 WONG               46688.40   1 條記錄已選擇。   4、Final Table final table“存儲”數據修改操作、引用完整性操作和觸發器操作之後的數據, 它可以用來檢查在執行insert,update或者delete的時候, 被操作的數據是否存在觸發器或者引用約束,此時final table關鍵詞會導致這些操作停止。 如下面這個例子中,我們創建一個觸發器,給新增員工增加10%的工資。 create trigger trig_empk after insert on empk  referencing new as n for each row mode db2sql update empk set salary=n.salary*1.1  where empno=n.empno   在執行下面語句的時候,我們就知道了,final table可以有效的避免這種隱藏的數據更改的操作。 select * from final table(insert into empk(empno,ename,salary) values('120821','ChenLinBo',50000)) ★SQL0989N  AFTER 觸發器 "TRIG_EMPK" 嘗試了修改表 "EMPK" 中由 FROM 子句內的 SQL數據更改語句修改的行。   SQLSTATE=560C3   db2 => select count(*) from empk where empno='120821' 1 -----------           0   1 條記錄已選擇。   添加數據時候,使用new table查看新的值,這個值是未經過任何觸發器或者約束修改過的。 db2 => select * from new table(insert into empk values('120821','ChenLinBo',50000)) EMPNO  ENAME           SALARY ------ --------------- ----------- 120821 ChenLinBo          50000.00 --★   1 條記錄已選擇。   db2 => select * from empk where empno='120821' EMPNO  ENAME           SALARY ------ --------------- ----------- 120821 ChenLinBo          55000.00 --★   1 條記錄已選擇。   5、Final Table和New Table的區別★ 他們都同樣的返回update或insert的中間結果數據,但是Final Table能確保對目標表的update和insert操作, 沒有觸發器或者應用完整性約束的後續數據修改,如上面這個例子。   來源 http://blog.csdn.net/bobo12082119/article/details/8775600

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved