全部產品
Search
文件中心

PolarDB:Returning

更新時間:Jul 06, 2024

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)