2016-06-09 42 views
0

我需要更新id_number & entry_time的記錄。 此表中沒有主鍵。 有人可以幫我這個截斷,插入轉換爲合併聲明:如何用pl/sql中的merge子句替換truncate-insert

CREATE OR REPLACE PACKAGE BODY PK_ENTRY_TIME IS 
    PROCEDURE PROC_ENTRY_TIME 
    AS 
    BEGIN 
     execute immediate 'truncate table TABLE_ENTRY_TIME'; 
     insert into TABLE_ENTRY_TIME SELECT TABLE_CASE.ID_NUMBER , TABLE_ACT_ENTRY.ENTRY_TIME 
FROM SA.TABLE_CASE TABLE_CASE INNER JOIN SA.TABLE_ACT_ENTRY TABLE_ACT_ENTRY 
ON TABLE_CASE.OBJID = TABLE_ACT_ENTRY.ACT_ENTRY2CASE 
    commit; 
    END PROC_ENTRY_TIME; 
    END PK_ENTRY_TIME; 
+0

你爲什麼要使用合併,而不是截斷+插入? – krokodilko

+0

如果沒有主鍵,則不能執行「MERGE」。如果您正在合併的行集中存在重複項,那麼您將得到一個錯誤ORA-30926(無法在源表中獲得一組穩定的行)。 –

回答

0

由於ID_NUMBER是一個獨特的價值,這工作:

CREATE OR REPLACE PACKAGE BODY PK_ENTRY_TIME IS 
    PROCEDURE PROC_ENTRY_TIME 
    MERGE INTO TABLE_ENTRY_TIME A 
    USING (SELECT TABLE_CASE.ID_NUMBER , TABLE_ACT_ENTRY.ENTRY_TIME 
    FROM SA.TABLE_CASE TABLE_CASE INNER JOIN SA.TABLE_ACT_ENTRY TABLE_ACT_ENTRY ON TABLE_CASE.OBJID = TABLE_ACT_ENTRY.ACT_ENTRY2CASE)B 

    ON (A.ID_NUMBER = B.ID_NUMBER) 

     WHEN MATCHED THEN 
     UPDATE SET 
     A.ENTRY_TIME = B.ENTRY_TIME 


    WHEN NOT MATCHED THEN 
    INSERT(ID_NUMBER,ENTRY_TIME) 
    VALUES(B.ID_NUMBER,B.ENTRY_TIME); 

COMMIT; 
END PROC_ENTRY_TIME; 
END PK_ENTRY_TIME;