gpt4 book ai didi

sql - ORACLE 更新返回旧值和新值

转载 作者:行者123 更新时间:2023-12-04 12:17:49 24 4
gpt4 key购买 nike

PL/SQL (Oracle 12c) 中是否有与此 T-SQL 查询等效的查询?
UPDATE A SET A.columnA = 10 WHERE A.columnB < 30 OUTPUT INSERTED.*, DELETED.*
查询更新表A,同时返回更新前和更新后的记录状态。

触发器对我以及更新前的 SELECT 记录和更新后的 SELECT 记录都不是解决方案。

最佳答案

不是直接的,而是使用 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

关于sql - ORACLE 更新返回旧值和新值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46927268/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com