2016-06-09 44 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;