1. 程式人生 > >ORACLE多表查詢儲存到新表,新增id自增觸發器

ORACLE多表查詢儲存到新表,新增id自增觸發器

先把需求明確一下,這次需要從其他兩個表(T1,T2)中查詢資料將其中兩個欄位相同的資料插入到另一張表中(T3),T3的id為主鍵不能為空

由於使用的是oracle,不能把T3的id設定成自增長就多出許多麻煩

為了解決oracle序列自增長的問題  採用了觸發器觸發序列自增長的方式來解決

1.首先建立一條自增長的序列,開始於1,每次增長1

CREATE SEQUENCE TOOLS_GRP_ID START WITH 1 INCREMENT BY 1;

2.其次建立觸發器,每次插入資料時都自動的引用序列的id進行新增

CREATE

OR REPLACE TRIGGER TOOLS_GRP BEFORE INSERT

ON MES_PRODUCE_TOOLS_GRP_DETAIL FOR EACH ROW

BEGIN

    SELECT

        TOOLS_GRP_ID.nextval INTO : NEW . ID

    FROM

        dual ;

    END ;

其中INTO : NEW . ID,NEW. 之後的為需要自增長的列名 ,

TOOLS_GRP:觸發器名稱,MES_PRODUCE_TOOLS_GRP_DETAIL:觸發器監聽物件,

TOOLS_GRP_ID:序列名稱   dual虛擬表是oracle資料庫常用的虛擬表只有一條記錄,沒有實際意義

在編寫觸發器的過程中遇到了[Err] ORA-24344: 成功, 但出現編譯錯誤

在查閱網上相關資料之後,並沒有實際解決 ,但修改列名後不知道怎麼的就有用了,總結有以下可能性

(1)網上有一種可能是資料庫列名大小寫問題,

解決方法應該所有列名都為大寫

(2)我自己的情況是列名本來都是全大寫的,不存在上一條的情況。

解決方法首先把表中的ID改為PID防止oracle無法識別,其次,在重新打了一次INTO : NEW . ID 之後編譯成功。

3.查詢T1,T2表格中的資料插入T3,自動觸發觸發器TOOLS_GRP 

INSERT INTO MES_PRODUCE_TOOLS_GRP_DETAIL (TOOLS_GRP_ID, TOOLS_ID) SELECT
        TOOLS_GRP_ID,
        TOOLS_ID
    FROM
        MES_PRODUCE_TOOLS_GRP,
        MES_PRODUCE_TOOLS
    WHERE
        MES_PRODUCE_TOOLS_GRP.TOOLS_GRP_NAME = MES_PRODUCE_TOOLS.JSON

完成需求大笑