2016-06-09 9 views
0

Ich muss die Datensätze ID-Nummer & entry_time aktualisieren. In dieser Tabelle gibt es keinen Primärschlüssel. Kann mir jemand helfen, diese truncate-Einsatz zu konvertieren Anweisung zu fusionieren:So ersetzen Sie truncate-einfügen mit Merge-Klausel in pl/sql

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

Warum Sie statt truncate + Insert verwenden wollen fusionieren ? – krokodilko

+0

Sie können ein 'MERGE' nicht ohne Primärschlüssel ausführen. Wenn in der Reihe der Zeilen, in die Sie eingemischt werden, Duplikate vorhanden sind, erhalten Sie den Fehler ORA-30926 (es ist nicht möglich, in den Quelltabellen eine stabile Reihe von Zeilen zu erhalten). –

Antwort

0

Da ID_NUMBER ein eindeutiger Wert ist, dies gearbeitet:

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; 
Verwandte Themen