首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ORACLE更新,返回旧值和新值

问ORACLE更新,返回旧值和新值
EN

Stack Overflow用户
提问于 2017-10-25 16:13:48
回答 2查看 5.6K关注 0票数 4

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

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

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

触发器不是我的解决方案,以及在更新之前选择记录和更新后选择记录。

EN

回答 2

Stack Overflow用户

发布于 2022-01-21 13:55:38

在使用execute immediate的情况下,上面的代码会是什么样子?像这样的东西?为了简单起见,我跳过了插入部分。

代码语言:javascript
复制
DECLARE
    sql_update  VARCHAR2(4000) := NULL;
    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
    sql_update := '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;
    EXECUTE IMMEDIATE sql_update;
  -- 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;
END;
/

当我执行上面的代码时,我得到

代码语言:javascript
复制
ORA-00925: missing INTO keyword
票数 0
EN

Stack Overflow用户

发布于 2022-01-21 15:26:19

你是说像这样吗?但我仍然得到相同的错误:

代码语言:javascript
复制
DECLARE
    sql_update  VARCHAR2(4000) := NULL;
    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
    sql_update := ' 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;
    EXECUTE IMMEDIATE sql_update;
  -- 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;
END;
/
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46927268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档