2017-10-25 7 views
1

PL/SQL(Oracle 12c)にこのT-SQLクエリと同等のものがありますか?OLD値とNEW値を返すORACLE更新

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

クエリの更新テーブルAと同時に、更新前と更新後のレコードの状態を返します。

トリガーは私のための解決策ではなく、以前のSELECTレコードと更新後のSELECTレコードです。

答えて

0

ない直接の1が、あなたは同じ効果を達成することができるようになりますRETURNING INTOを使用して:

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


から取られたアイデア:Returning Old value during update