在oracle中创建数据传输的触发器

时间:2013-11-29 06:25:16

标签: sql oracle

我在Oracle db中有3个表,表结构如下,一旦所有记录都输入,应用程序将在Tnx_tmp表中写入20k行应用程序将通过更新名称和状态为“U”的文件名和标志字段来更新状态表。一旦状态为“U”。所有这些20K行需要复制到Tnx表并将状态表的标志字段更新为“P”。 每行由RNO唯一标识。 另一个应用程序正在读取Tnx表并更新STAT字段 一旦STAT字段为“X”,同样需要在Tnx_tmp表中更新,一旦所有20k行的Tnx_tmp更新为“X”,状态表应该更新为文件名和标志字段,状态为“C”。 / p>

因为我是Oracle新手请告诉我如何继续。我应该使用触发器还是有其他方法。

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)

1 个答案:

答案 0 :(得分:0)

这听起来像是使用PROCEDURE来解决的完美解决方案。

我会创建一个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;