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語句繼承事務上下文,需要通過顯式的提交或復原來結束事務。
參數說明如下。
參數 | 說明 |
| 期望返回的欄位,多個欄位間用英文逗號(,)分隔。欄位需滿足如下要求:
|
| 需要執行的DML語句,支援如下語句:
|
樣本
本文以表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 as
、insert 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)