熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

關於觸發器修改自身數據表實例

2013-11-13 22:15:43  來源: Oracle 

   前言
  當然在觸發器修改自身數據表對於有ORACLE數據庫後台編程人員來說並不應該算是一個難題可能在平時的工作中就經常要遇到
  但對於剛剛使用ORACLE數據庫後台編程人員來說的確是一個比較煩人的問題
  
   說明
  ORACLE的觸發器分為兩類行觸發器(For Each Row)和表觸發器在行觸發器中不得將Insert/Update/Delete語句作用於自身數據表在表觸發器中不得使用:New/:Old語句
  但在實際編程過程中我們往往需要對自身數據表進行DML(Insert/Update/Delete)操作同時引用:New/:Old對象
  如使用Insert Into xxx (Select * From yyy Where xKey=)語句後我們需要保存插入記錄的時間由於數據庫操作的時間差我們不可以使用:NewxDate:=SysDate語句<使用這一語句後插入的每筆記錄xDate的數值會不一樣可相差數秒>
  對我們來說最好的語句是Update xxx Set xDate=SysDate Where xKey=:NewxKey此時我們使用Update語句的同時又使用了:New對象ORACLE認為不合法
  
   解決提案
  實現此需求我們需要建立一個行觸發器一個表觸發器以及一個程序包
  
   創建測試環境
  Drop Table xxx;
  Drop Table yyy;
  創建數據表
  Create Table xxx(
    xKey  Number()
    xDate  Date
    xData  number());
  Create Table yyy(
    xKey  Number()
    xDate  Date
    xData  number());
  
   創建程序包設立全局變量G_xKe
  Create Or Replace Package Pkg_xxx_Update
  as
    G_xKey xxxxKey%Type;
  End Pkg_xxx_Update;
  /
   創建行觸發器並將xKey的值存入程序包的全局變量中
  Create Or Replace Trigger TRG_Upd_xxx_Rec
  After Insert On xxx
  For Each Row
  Begin
    Pkg_xxx_updateG_xKey:=:NewxKey;
  End;
  /
   創建表觸發器根據程序包的全局變量對數據表的xDate字段進行更新
  Create Or Replace Trigger TRG_Upd_xxx_TB
  After Insert On xxx
  Begin
    Update xxx
     set 
       xDate=SysDate 
     Where
       xKey=PKG_xxx_UpdateG_xKey;
  End;
  /
   插入大量數據
  <<InsertMultiRecord>>
  Declare 
  L_Count Number:=;
  Begin
  Delete from yyy;
  While L_Count<
  Loop
  insert into yyy
  values( SysDate L_Count);
  L_Count:=L_Count+;
  End Loop;
  Commit;
  End InsertMultiRecord;
  
   測試觸發器
  Insert Into xxx
    (Select * from yyy);
  Commit;
  Select * From xxx;
From:http://tw.wingwit.com/Article/program/Oracle/201311/18637.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.