PolarDB提供Returning功能,支持在使用DML语句后返回结果集(Resultset)报文。本文介绍如何使用PolarDB的Returning功能。

前提条件

PolarDB集群版本需为PolarDB MySQL引擎5.7版本且Revision version为5.7.1.0.6或以上,您可以参见查询版本号确认集群版本。

背景信息

MySQL的DML语句执行结果报文通常为OK或ERR,返回的结果报文中仅包括影响的记录数、扫描记录等信息,而不会返回结果集(Resultset)以显示具体的记录。但在很多业务场景中,执行完INSERT、UPDATE、DELETE等DML语句后,通常还需要再执行一次SELECT查询,来确认当前的记录内容,方便接下来的业务处理。

为减少客户端和服务器的交互次数并保证与MySQL语法的兼容性,PolarDB提供了Returning功能,支持在使用DML语句后返回结果集报文。

语法

CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);
说明 CALL DBMS_TRANS.RETURNING() 不是事务性语句,会根据DML语句继承事务上下文,需要通过显式的提交或回滚来结束事务。

参数说明如下。

参数 说明
Field_list 期望返回的字段,多个字段间用英文逗号(,)分隔。字段需满足如下要求:
  • 仅支持表中的原生字段或用星号(*)表示所有字段。
  • 不支持对字段进行计算或聚合等操作。
Statement 需要执行的DML语句,支持如下语句:
  • INSERT
  • UPDATE
  • DELETE

示例

本文以表t(建表语句如下所示)为例,介绍如何使用Returning功能,返回DML语句的结果集(Resultset)报文。

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;
  • INSERT
    说明 INSERT returning只支持 insert values形式的语法,不支持 create asinsert select等形式的语法(如 CALL DBMS_TRANS.RETURNING("", "insert into t select * from t");),否则将报错(如 ERROR 7527 (HY000): Statement didn't support RETURNING clause)。
    使用如下命令查看需要使用INSERT语句插入的记录:
    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)
    Field_list留空,例如使用了 call dbms_trans.returning("", "insert into t(id) values(NULL),(NULL)");命令,返回结果将只显示OK或ERR报文。示例如下:
    Query OK, 2 rows affected (0.01 sec)
    Records: 2  Duplicates: 0  Warnings: 0
    此时如需查看表当前的记录内容,请使用 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)
  • UPDATE
    说明 UPDATE Returning不支持涉及多表的UPDATE语句。
    使用如下命令查看使用UPDATE语句更新后的记录:
    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)
  • DELETE
    使用如下命令查看需要使用DELETE语句删除的记录:
    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)