专栏首页bisal的个人杂货铺select from update row的实现

select from update row的实现

DTCC大会上,阿里江疑的演讲中提到一个:select from update hot row;

不明白如何在Oracle中实现的,他的意思是在一条SQL中实现update和select这条update的字段信息。

经dbsnake指点,了解到这是模仿了Oracle的returning into子句,可以将使用的DML语句影响的行记录的指定列的值select出来。

官方文档中有示例:

http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/tuning.htm

You can use the BULK COLLECT clause in the RETURNING INTO clause of an INSERTUPDATE, or DELETE statement:

Example 11-15 Using BULK COLLECT With the RETURNING INTO Clause

CREATE TABLE emp_temp AS SELECT * FROM employees;
DECLARE
   TYPE NumList IS TABLE OF employees.employee_id%TYPE;
   enums NumList;
   TYPE NameList IS TABLE OF employees.last_name%TYPE;
   names NameList;
BEGIN
   DELETE FROM emp_temp WHERE department_id = 30
      RETURNING employee_id, last_name BULK COLLECT INTO enums, names;
   DBMS_OUTPUT.PUT_LINE('Deleted ' || SQL%ROWCOUNT || ' rows:');
   FOR i IN enums.FIRST .. enums.LAST
   LOOP
      DBMS_OUTPUT.PUT_LINE('Employee #' || enums(i) || ': ' || names(i));
   END LOOP;
END;
/

注意:需要在sqlplus中执行set serveroutput on子句

上面例子对于不熟悉PLSQL的不是很好理解,用一个简单的示例说明:

1. 创建测试表:

create table tbl_returninto(
id number,
remark varchar2(5));
SQL> select * from tbl_returninto;
	ID REMARK
---------- --------------------------------------------------
	 2 one
	 3 two
	 4 three

2. 插入一条记录,使用returning into在同一条SQL中获得插入的id值:

SQL> declare
  2  l_id tbl_returninto.id%type;
  3  begin
  4  insert into tbl_returninto values(tr_seq.nextval, 'one')
  5  returning id into l_id;
  6  commit;
  7  dbms_output.put_line('id=' || l_id);
  8  end;
  9  /
id=1

PL/SQL procedure successfully completed.

3. 更新和删除一条记录,使用returning into获得更新和删除的id值:

SQL> declare l_id tbl_returninto.id%type;
  2  begin
  3  update tbl_returninto
  4  set remark = 'one2'
  5  where id = 2
  6  returning id into l_id;
  7  dbms_output.put_line('UPDATE ID=' || l_id);
  8  delete from tbl_returninto where remark = 'three'
  9  returning id into l_id;
 10  dbms_output.put_line('DELETE ID=' || l_id);
 11  commit;
 12  end;
 13  /
UPDATE ID=2
DELETE ID=4

PL/SQL procedure successfully completed.

总结

使用returning into子句可以在一条SQL中将insert、update和delete影响的行记录指定字段信息select出来,其中insert和update都是执行之后的结果,delete是执行之前的结果。当然,其实这里用的是PLSQL的语法实现。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一次夜维SQL的性能优化

    最近单位搬家,从国家会议中心,搬往空气清新的顺义后沙峪,搬迁之前的完结上线中,碰见了一些棘手的问题,有一些值得借鉴的地方。

    bisal
  • connect by超乎你想象

    SQL中的connect by主要用在层级关系的查询,乍看确实可能有些绕,但在某些场景下,确实方便,语法格式如下,

    bisal
  • left/right join中on和where的区别

    开发同学提了个问题,如下两种left join中on和where条件的写法是否等价?

    bisal
  • spring3+mbatis3开发实例

    最近一直在深入了解struts2,spring,hibernate以及mybatis框架,通过查看这些框架的源码和官方文档,发现自己对于这些框架的原理,使用有了...

    py3study
  • uniapp带参数跳转,新页面接收参数

    1:index.vue的页面,在按钮上绑定点击事件,将所要传递的参数放在点击事件的方法里面。

    王小婷
  • 那些可以绕过WAF的各种特性

    在攻防实战中,往往需要掌握一些特性,比如服务器、数据库、应用层、WAF层等,以便我们更灵活地去构造Payload,从而可以和各种WAF进行对抗,甚至绕过安全防御...

    Bypass
  • 记一次mysql优化

    今天在技术经理的现场优化中,把一条需要40000ms的sql语句优化到9ms左右,将近提高4500多倍的速度

    botkenni
  • TP踩过的坑【批量删除,(不涉及子栏目的批量删除)】

    简单、
  • Oracle 20c 新特性:自动的区域图 - Automatic Zone Maps

    导读:Zone Maps 是一个独立的访问结构,可以为表独立建立。在表和索引扫描期间,区块图可以根据表列上的谓词来修剪表的磁盘块和分区表的潜在完整分区。区块映射...

    数据和云
  • 获取jqGrid中选择的行的数据

    var id=$(‘#gridTable’).jqGrid(‘getGridParam’,'selrow’);

    ydymz

扫码关注云+社区

领取腾讯云代金券