2017-10-25 12 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 기록하지 않고 업데이트 한 후 기록을 선택합니다.

답변

0

아니 직접 하나,하지만 사용 RETURNING INTO 같은 효과를 얻을 수있을 것입니다은 : Returning Old value during update

:

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


아이디어에서 촬영