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

目录
相关文章
|
存储 安全 编译器
|
NoSQL 测试技术 Linux
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
VLDB顶会论文Async-fork解读与Redis在得物的实践
293 0
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
|
Java API 数据处理
使用Java内存映射(Memory-Mapped Files)处理大文件
NIO中的内存映射 (1)什么是内存映射文件 内存映射文件,是由一个文件到一块内存的映射,可以理解为将一个文件映射到进程地址,然后可以通过操作内存来访问文件数据。说白了就是使用虚拟内存将磁盘的文件数据加载到虚拟内存的内存页,然后就可以直接操作内存页数据。
8273 0
|
SQL 关系型数据库 MySQL
当并发insert on duplicate key update遇见死锁:更新丢失
数据库死锁问题,是一个老生常谈且很常见的问题,网上也有非常多对于各类死锁场景的解析和复现,但凡和死锁有关,无外乎不涉及数据库隔离等级、索引、以及innodb锁等相关原因。但是我这个案例我搜遍了全网也没能找到比较相似情况。于是我想尽可能的复现出这种情况,找出死锁的原因,找出可能出现的隐患。问题的背景:我们的数据库中的发生死锁的表是具有”多列组合构建的唯一索引“(不包含
20891 4
|
负载均衡 Kubernetes 网络协议
如何在集群的负载均衡过程保留请求源IP
本文探讨了在Kubernetes (k8s)集群中如何确保服务获取到请求的源IP。通常,源IP可能会因网络地址转换(NAT)和代理服务器而丢失。为保留源IP,文章建议在代理服务器层添加HTTP头`X-REAL-IP`字段。在K8s中,通过设置`externalTrafficPolicy: Local`可保留源IP,但这会牺牲负载均衡。使用Ingress时,可通过配置Ingress Controller的`use-forwarded-headers`并调整ConfigMap来同时保留源IP和实现负载均衡。文章适用于对网络和K8s感兴趣的读者。
369 3
|
存储 NoSQL MongoDB
MongoDB技术架构详解
MongoDB技术架构详解
|
分布式计算 算法
分布式系统设计之共识算法—2PC、3PC、 Paxos
分布式系统设计之共识算法—2PC、3PC、 Paxos
317 1
|
存储 安全 Java
提升编程效率的利器: 解析Google Guava库之集合篇Table二维映射(四)
提升编程效率的利器: 解析Google Guava库之集合篇Table二维映射(四)
|
IDE Java 开发工具
Lombok 详解:简化 Java 开发的神奇工具
Lombok 是一款 Java 工具,通过注解自动处理如 getter/setter、toString、equals 和 hashCode 等常见代码,减少样板代码。安装 Lombok 需要在 IDE(如 IntelliJ IDEA)中添加插件,并在 Maven 或 Gradle 项目中配置依赖。常用注解包括 @Getter/@Setter 生成访问器,@ToString 生成对象描述,@EqualsAndHashCode 生成比较方法,@NoArgsConstructor/@AllArgsConstructor 生成构造器,@Data 综合应用这些注解。
1369 9
|
JSON 数据格式
手把手教你将 Github 私有仓库部署到 Vercel
手把手教你将 Github 私有仓库部署到 Vercel
2323 0