Oracle SQL - 我可以返回列值的"之前"状态

Pan*_*cho 11 sql oracle

假设myTable中的以下行:

id     =  1
letter = 'a'
Run Code Online (Sandbox Code Playgroud)

在Oracle中,可以轻松地执行以下操作:

update myTable set
  letter = 'b'
where id   = 1
returning letter 
into myVariable;
Run Code Online (Sandbox Code Playgroud)

然后myVariable将保持值'b'.

我正在寻找的是一些返回字母"之前"值的方法

即.将以前的更新替换为:

update myTable set
  letter = 'b'
where id   = 1
returning letter "before the update"
into myVariable;
Run Code Online (Sandbox Code Playgroud)

然后myVariable应该保持值'a';

我知道T-SQL可以通过OUTPUT子句实现这一点.

有没有Oracle等效的方法来实现这一点,所以我不必先做一个"选择"只是为了得到之前的值?

Mik*_*ike 11

update
  (
   select T.*, (select letter from DUAL) old_letter
     from myTable T
    where id=1
  )
   set letter = 'b'
returning old_letter into myVariable;
Run Code Online (Sandbox Code Playgroud)

在Oracle 11.2上测试过

  • 这很有趣. (3认同)
  • @krokodilko我测试了"简化"的字母作为old_letter` - 没有用.在这种情况下,Oracle返回新值.只有subselect欺骗Oracle (2认同)
  • @Pancho - `它看起来没有比执行select更新效率更高效 - **它更有效**因为只需要一个操作而不是两个操作.只需做一个简单的实验,您将看到 - 在循环中运行两个过程(单个更新与选择+更新)10.000次并比较它们的执行时间. (2认同)