【问题标题】:ORACLE update with returning OLD and NEW valuesORACLE 更新并返回 OLD 和 NEW 值
【发布时间】:2018-04-06 05:44:35
【问题描述】:

PL/SQL (Oracle 12c) 中是否有与此 T-SQL 查询等效的功能?

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

查询更新表A,同时返回更新前和更新后记录的状态。

触发器不是我的解决方案,更新之前的 SELECT 记录和更新后的 SELECT 记录。

【问题讨论】:

    标签: sql oracle tsql plsql oracle12c


    【解决方案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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-10
      • 2012-10-19
      • 1970-01-01
      • 2021-10-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多