2013-11-29 11 views
0

我在Oracle數據庫3個表,表結構如下,應用程序將在一次的所有記錄被輸入的應用程序將通過更新文件名和標誌字段以更新狀態表Tnx_tmp表寫20K行名稱和狀態「U」。一旦狀態爲「U」。所有這些20K行需要被複制到歸檔狀態表被更新爲「P」 TNX表和標誌。 每行由RNO唯一標識。 另一個應用讀取TNX表,只要STAT字段是「X」需要在Tnx_tmp表進行更新,同時更新STAT場 ,一旦所有的20K行Tnx_tmp被更新爲「X」和狀態表應該用狀態「C」的文件名和標誌字段進行更新。在Oracle中創建數據傳送觸發

由於我是新來的Oracle請讓我知道如何proceed.Should我使用觸發器或有任何其他方式。

1)Tnx_tmp

Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
PRID           VARCHAR2(4) 
TYPE           VARCHAR2(2) 
PRCD           VARCHAR2(2) 
TCD           VARCHAR2(5) 
RNO          NOT NULL VARCHAR2(25) 
FNO           VARCHAR2(17) 
TNO            VARCHAR2(17) 
TAMT            VARCHAR2(14) 
NARRATION           VARCHAR2(50) 
JNO           VARCHAR2(9) 
TDT            DATE 
STAT            VARCHAR2(2) 
ERRNO            VARCHAR2(4) 
ERRDESC           VARCHAR2(100) 
STAT1            CHAR(1) 
PACK            CHAR(2) 
RMSG           VARCHAR2(200) 
QUPDTIME           VARCHAR2(15) 
QOUTTIME           VARCHAR2(15) 
RESPODTTIME          VARCHAR2(17) 
APPREAD           CHAR(1) 
OUTQNAME           CHAR(1) 
FILENAME           VARCHAR2(15) 

2)狀態

FILENAME           VARCHAR2(15) 
FLAG            VARCHAR2(3) 

3)TNX

Name          Null? Type 
----------------------------------------- -------- ---------------------------- 
PRID           VARCHAR2(4) 
TYPE           VARCHAR2(2) 
PRCD           VARCHAR2(2) 
TCD           VARCHAR2(5) 
RNO          NOT NULL VARCHAR2(25) 
FNO           VARCHAR2(17) 
TNO            VARCHAR2(17) 
TAMT            VARCHAR2(14) 
NARRATION           VARCHAR2(50) 
JNO           VARCHAR2(9) 
TDT            DATE 
STAT            VARCHAR2(2) 
ERRNO            VARCHAR2(4) 
ERRDESC           VARCHAR2(100) 
STAT1            CHAR(1) 
PACK            CHAR(2) 
RMSG           VARCHAR2(200) 
QUPDTIME           VARCHAR2(15) 
QOUTTIME           VARCHAR2(15) 
RESPODTTIME          VARCHAR2(17) 
APPREAD           CHAR(1) 
OUTQNAME           CHAR(1) 
+0

通常觸發器不應該用來提供複雜的業務規則,更好地使用函數和過程。你是從什麼開始的,還是你喜歡我們寫你的整個應用程序? –

+0

,因爲我是新來的Oracle我開始與觸發,但發現很難處理所有的場景,因此被卡 – Mani

+0

只有使用觸發,如果它是絕對必要的。特別是不要爲您的業務邏輯使用觸發器。只是使用於複製從文件tnx_tmp,然後從tnx_tmp等一攬子根據您所設定的標誌,一旦出事了退出的過程。 – Armunin

回答

0

這聽起來像一個完美的解決方案使用PROCEDURE s到解決。

我會創建一個PACKAGE,因此您可以將所有的PROCEDURE都捆綁到一個易於維護的代碼部分。

CREATE OR REPLACE PACKAGE temporary_transactions_pkg 
AS 
    PROCEDURE load_temporary_transaction (
    p_PRID  TXN_TMP.PRID%TYPE, 
    p_TYPE  TXN_TMP.TYPE%TYPE, 
    p_PRCD  TXN_TMP.PRCD%TYPE, 
    p_TCD   TXN_TMP.TCD%TYPE 
    -- ..... more variables 
); 

    PROCEDURE update_status_table (
    p_FILENAME STATUS.FILENAME%TYPE, 
    p_FLAG  STATUS.FLAG%TYPE 
); 
END temporary_transactions_pkg; 
/

CREATE OR REPLACE PACKAGE BODY temporary_transactions_pkg 
AS 
    PROCEDURE load_temporary_transaction (
    p_PRID  TXN_TMP.PRID%TYPE, 
    p_TYPE  TXN_TMP.TYPE%TYPE, 
    p_PRCD  TXN_TMP.PRCD%TYPE, 
    p_TCD   TXN_TMP.TCD%TYPE 
    -- ..... more variables 
) 
    AS 
    BEGIN 
    INSERT INTO TXN_TMP 
     (PRID, TYPE, PRCD, TCD) 
    VALUES 
     (p_PRID, p_TYPE, p_PRCD, p_TCD); 
    EXCEPTION 
    WHEN others THEN 
     DBMS_OUTPUT.PUT_LINE('TODO - Handle Exception'); 
    END load_temporary_transaction; 

    PROCEDURE update_status_table (
    p_FILENAME STATUS.FILENAME%TYPE, 
    p_FLAG  STATUS.FLAG%TYPE 
) 
    AS 
    BEGIN 
     STATUS Status 
     SET FILENAME = p_FILENAME, 
      FLAG  = p_FLAG; 

     INSERT INTO TXN 
     SELECT * FROM TXN_TMP; 

     -- 
     -- TODO complete with your business logic. 
     -- 
    END update_status_table; 
END temporary_transactions_pkg;