2017-10-25 1 views
1

Entspricht diese T-SQL-Abfrage in PL/SQL (Oracle 12c)?ORACLE-Update mit OLD- und NEW-Werten

UPDATE A SET A.columnA = 10 WHERE A.columnB < 30 OUTPUT INSERTED.*, DELETED.*

Die Abfrage-Updates Tabelle A und in der gleichen Zeit gibt den Status des Datensatzes vor dem Update und nach dem Update.

Trigger ist keine Lösung für mich sowie SELECT Datensätze vor und SELECT Datensätze nach der Aktualisierung.

Antwort

0

kein direkter, aber unter Verwendung von RETURNING INTO werden Sie in der Lage sein, um die gleiche Wirkung zu erzielen:

CREATE TABLE A(columnA VARCHAR2(10), columnB INT); 
INSERT INTO A(columnA, columnB) VALUES ('Test', 10); 
INSERT INTO A(columnA, columnB) VALUES ('Row 2', 20); 
CREATE TABLE audit_table(col_new VARCHAR2(10),col_old VARCHAR2(10)); 

DECLARE 
    TYPE rec IS RECORD (actual A.columnA%TYPE, old A.columnA%TYPE); 
    TYPE col_a_t IS TABLE OF rec; 
    v_a col_a_t; 
BEGIN 
    UPDATE (SELECT A.*, (SELECT A.columnA FROM dual) AS old_columnA FROM A) 
    SET columnA = 'XYZ' 
    WHERE columnB < 30 
    RETURNING columnA, old_columnA BULK COLLECT INTO v_a; 
    COMMIT; 

    -- printing for debug 
    FOR i IN v_a.first .. v_a.last LOOP 
    dbms_output.put_line('Old =>' || v_a(i).old || ' new => ' || v_a(i).actual); 
    END LOOP; 

    -- additional 
    FORALL i IN v_a.first .. v_a.last 
    INSERT INTO audit_table VALUES v_a(i); 
    COMMIT; 
END; 
/

SELECT * FROM A; 
SELECT * FROM audit_table; 

DBFiddle Demo


Idee entnommen aus: Returning Old value during update

Verwandte Themen