select from update row的实现

简介: DTCC大会上,阿里江疑的演讲中提到一个:select from update hot row;不明白如何在Oracle中实现的,他的意思是在一条SQL中实现update和select这条update的字段信息。

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的语法实现。

目录
相关文章
|
12月前
|
索引
不推荐SELECT * FROM table原因
根据非索引查询 :B+树的叶子节点放数据表行数据,叶子节点存放主键,如果想获得行数据信息,则需要再跑到主键索引去拿数据,这叫回表,速度慢。但不管是主键还是非主键索引,他们的叶子结点数据都是有序的。比如在主键索引中,这些数据是根据主键id的大小,从小到大,进行排序的。**1.**根据索引查询 :B+树的父节点放索引数据,速度快,叶子(父)节点会存放完整的行数据西信息。
365 0
|
SQL 数据库
INSERT DESC UPDATE SELECT
INSERT DESC UPDATE SELECT
90 0
|
11月前
|
数据库 OceanBase
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
使用 `INSERT INTO table_name SELECT * FROM table_name` 这种方式
67 1
|
12月前
|
数据库 OceanBase
INSERT INTO table_name SELECT * FROM table_name
INSERT INTO table_name SELECT * FROM table_name
48 1
|
数据库 索引
SELECT
SELECT
61 0
|
存储 前端开发 JavaScript
select2 使用详解
select2 使用详解
|
存储 SQL 缓存
到底为什么不建议使用SELECT *?
“不要使用SELECT *”几乎已经成为了MySQL使用的一条金科玉律,就连《阿里Java开发手册》也明确表示不得使用`*`作为查询的字段列表,本文从4个方面给出理由。
到底为什么不建议使用SELECT *?
|
SQL 关系型数据库 MySQL
Select for update使用详解
前言 近期开发与钱相关的项目,在高并发场景下对数据的准确行有很高的要求,用到了for update,故总结一波以便日后留恋。 for update的使用场景 如果遇到存在高并发并且对于数据的准确性很有要求的场景,是需要了解和使用for update的。 比如涉及到金钱、库存等。一般这些操作都是很长一串并且是开启事务的。如果库存刚开始读的时候是1,而立马另一个进程进行了update将库存更新为0了,而事务还没有结束,会将错的数据一直执行下去,就会有问题。所以需要for upate 进行数据加锁防止高并发时候数据出错。
2303 0
select2 没有 allowClear 不生效
select2 没有 allowClear 不生效 image.png 添加: placeholder: "请选择", placeholderOption: "first", $("[name=deptNo]").
1333 0