背景

MySQL 对于 statement 执行结果报文通常分为两类 Resultset 和 OK/ERR,针对 DML 语句则返回OK/ERR 报文,其中包括几个影响记录,扫描记录等属性。但在很多业务场景下,通常 INSERT/UPDATE/DELETE 这样的DML语句后,都会跟随 SELECT 查询当前记录内容,以进行接下来的业务处理, 为了减少一次 Client DB Server 交互,类似 PostgreSQL / Oracle 都提供了 returning clause 支持 DML 返回 Resultset。

AliSQL 为了减少对 MySQL 语法兼容性的侵入,并支持 returning 功能, 采用了 native procedure 的方式,使用DBMS_TRANS package,统一使用 returning procedure 来支持 DML 语句返回 Resultset。

语法

DBMS_TRANS.returning(Field_list=>, Statement=>);

其中:

Field list : 代表期望的返回字段,以 "," 进行分割,支持 * 号表达;

Statement :表示要执行的DML 语句, 支持 INSERT / UPDATE / DELETE;

INSERT Returning

针对 insert 语句, returning proc 返回插入到表中的记录内容;

例如:

CREATE TABLE `t` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`col1` int(11) NOT NULL DEFAULT '1',

`col2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,

PRIMARY KEY (`id`)

) ENGINE=InnoDB;

mysql> call dbms_trans.returning("*", "insert into t(id) values(NULL),(NULL)");

+----+------+---------------------+

| id | col1 | col2 |

+----+------+---------------------+

| 1 | 1 | 2019-09-03 10:39:05 |

| 2 | 1 | 2019-09-03 10:39:05 |

+----+------+---------------------+

2 rows in set (0.01 sec)

如果没有填入任何 Fields, returning 将退化成 OK/ERR 报文:

mysql> call dbms_trans.returning("", "insert into t(id) values(NULL),(NULL)");

Query OK, 2 rows affected (0.01 sec)

Records: 2 Duplicates: 0 Warnings: 0

mysql> select * from t;

+----+------+---------------------+

| id | col1 | col2 |

+----+------+---------------------+

| 1 | 1 | 2019-09-03 10:40:55 |

| 2 | 1 | 2019-09-03 10:40:55 |

| 3 | 1 | 2019-09-03 10:41:06 |

| 4 | 1 | 2019-09-03 10:41:06 |

+----+------+---------------------+

4 rows in set (0.00 sec)

注意:  INSERT returning 只支持 insert values 形式的语法,类似create as, insert select 不支持, 例如:

mysql> call dbms_trans.returning("", "insert into t select * from t");

ERROR 7527 (HY000): Statement didn't support RETURNING clause

UPDATE Returning

针对 update 语句, returning 返回更新后的记录:

例如:

mysql> call dbms_trans.returning("id, col1, col2", "update t set col1 = 2 where id >2");

+----+------+---------------------+

| id | col1 | col2 |

+----+------+---------------------+

| 3 | 2 | 2019-09-03 10:41:06 |

| 4 | 2 | 2019-09-03 10:41:06 |

+----+------+---------------------+

2 rows in set (0.01 sec)

注意: UPDATE returning 不支持多表 update 语句。

DELETE Returning

针对 delete 语句, returning 返回删除的记录前映像:

例如:

mysql> call dbms_trans.returning("id, col1, col2", "delete from t where id < 3");

+----+------+---------------------+

| id | col1 | col2 |

+----+------+---------------------+

| 1 | 1 | 2019-09-03 10:40:55 |

| 2 | 1 | 2019-09-03 10:40:55 |

+----+------+---------------------+

2 rows in set (0.00 sec)

注意

1. 事务上下文

DBMS_TRANS.returning() 不是事务性语句,根据 DML statement 来继承 事务上下文,

结束事务需要显式的 COMMIT 或者 ROLLBACK。

2. 字段不支持计算

Field list 中,只支持表中原生的字段,或者 * 号, 不支持进行计算或者聚合等操作。

mysql returning into_RDS MySQL 8.0 Returning-阿里云开发者社区相关推荐

  1. mysql放开权限控制_mysql06---权限控制-阿里云开发者社区

    mysql权限管理: mysql的权限控制,首先在user表判断有没有权限连,连上后看有没有全局权限.然后看db表有哪些库级别的权限.然后看tables_priv表有哪些表级别的权限.最后还可以看有哪 ...

  2. ecs加解密_阿里云发布ECS磁盘加密,一键加密,业务0改动-阿里云开发者社区

    当下,数据安全问题层出不穷,数据安全已经成为企业用户的生命线.为了保障用户数据安全,阿里云ECS云服务器正式向全网客户发布了"ECS磁盘加密"功能. 阿里云 ECS 磁盘加密功能可 ...

  3. bae 3.0 mysql_bae3.0 mysql 有时报错?报错-问答-阿里云开发者社区-阿里云

    Jfinal 用的MySQL的数据源:MysqlDataSource ds = new MysqlDataSource(); Config: MysqlDataSource ds = new Mysq ...

  4. mysql 提高事物效率_怎么提高向mysql中插入数据的效率-问答-阿里云开发者社区-阿里云...

    String[] filelist = file.list(); for(String filename : filelist){ BufferedReader br = new BufferedRe ...

  5. mysql 触发器trigeer_MySQL触发器trigger的使用-阿里云开发者社区

    Q:什么是触发器? A: 触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合. 触发器的特性: 1.有begin end体,begin end;之间的语句可以写的简单或者 ...

  6. perl dbi mysql 参数_perl dbi mysql-值精度 -问答-阿里云开发者社区-阿里云

    user @ host:〜# mysql -V -mysql Ver 14.14 Distrib 5.7.25-28,用于debian-linux-gnu(x86_64),使用在debian-9,9下 ...

  7. mysql sql rowcount_ORACLE中的SQL%ROWCOUNT与MySQL中的ROW_COUNT()的一点异同-阿里云开发者社区...

    MySQL的ROW_COUNT()和ORACLE中的SQL%ROWCOUNT函数作用并不完全相同.从作用上来说,两者都是返回前一个SQL进行UPDATE,DELETE,INSERT操作所影响的行数,但 ...

  8. coba mysql_在Android Studio中将数据从MySQL数据库显示到TextView中-问答-阿里云开发者社区-阿里云...

    我是新手,Android Studio我想将数据库(我使用MySQL)中的数据显示到中TextView.我也使用Button和RadioButton.单击按钮后,数据将显示在中TextView.这是我 ...

  9. xml文件导入mysql_如何使用XML_LOAD()将XML文件导入MySQL数据库表;功能?mysql-问答-阿里云开发者社区-阿里云...

    我有一个看起来像这样的XML文件: 539 Name Surname email.domain.com 2011-04-02 13:30:00 2011-04-02 18:15:00 1,2,4,5, ...

  10. 阿里云 mysql日志分析_mysql 慢日志分析-阿里云开发者社区

    启用 slow log 有两种启用方式: 1, 在my.cnf 里 通过 log-slow-queries[=file_name] 2, 在mysqld进程启动时,指定--log-slow-queri ...

最新文章

  1. pytorch下载时出现错误:EOFError: Compressed file ended before the end-of-stream marker was reached
  2. 厦门试点医疗大数据 产值有望达1200亿
  3. xpdf将pdf转换为html,(WordExcelPDF文件转换成HTML整理.docx
  4. 前端“黑话”polyfill
  5. 缓存击穿/穿透/雪崩
  6. OJ4007-计算字符串距离【各种dp之2】
  7. 批量修改linux换行格式,linux中sed命令批量修改
  8. CDN技术详解之系统架构
  9. matlab三维绘图函数plot3【matlab图行绘制四】
  10. kubernetes v1.11 生产环境 二进制部署 全过程
  11. keil编译后MCU需要的flash和RAM容量
  12. xxl-job 带参数执行和高可用部署
  13. 「九省联考 2018」制胡窜 (SAM)(线段树合并)(分类讨论)
  14. IDEA设置成白色背景
  15. 易语言安卓模拟器adb模块制作查看模拟器设备adb devices
  16. 学习笔记整理:网络应用技术-实验-路由器交换机配置命令
  17. 最受商户关注的五大进销存软件,这份贴心排行榜秘籍请收好
  18. hdu 1789题解
  19. 韩顺平老师讲解13个自学编程的坑
  20. java类图与代码实例

热门文章

  1. R-时间序列-分解季节性时间序列
  2. 如何从 0 到 1 搭建性能检测系统(修正版)
  3. 朋友圈的设计及实现。
  4. Python练习题——温度单位转换问题
  5. {literal} php 标签,php – 动态JavaScript的Smarty {literal}标签的替代品
  6. android visibility动画,android – 动画和setVisibility
  7. 12.10 快手 滑块js逆向 did 设备注册 滑块验证 技术交流
  8. 数智化时代企业研发的4阶段演进趋势
  9. codewar python 遗忘点
  10. 智能家居-1.基于esp8266的语音控制系统(开篇)