PolarDB-X Standard Editionは、戻り機能を提供します。 この機能により、DMLステートメントは結果セットを返すことができます。 DBMS_TRANSパッケージは、ユーザーがこの機能を簡単に使用できるように提供されています。
背景情報
MySQL文の実行結果は、結果セット、OKパケット、ERRパケットの3つのタイプに分けられます。 OKまたはERRパケットには、影響を受けるレコードの数やスキャンされたレコードの数などの属性が含まれます。 ただし、DMLステートメント (INSERT、UPDATE、またはDELETE) の実行に続いて、現在のレコードを照会するSELECTステートメントが実行されることがよくあります。 このような場合、戻り機能により、サーバーは2つのステートメントの実行結果を組み合わせて結果セットにすることで、クライアントに1回だけ応答できます。
前提条件
インスタンスのエディションはPolarDB-X Standard editionで、エンジンはMySQL 8.0です。
構文
DBMS_TRANS.returning(<Field_list >,< ステートメント>);
下表に、各パラメーターを説明します。
パラメーター | 説明 |
フィールド_リスト | 返されるフィールド。The fields to return. 複数のフィールドを入力する場合は、コンマ (,) で区切ります。 指定されたテーブルのネイティブフィールドとワイルドカード (*) がサポートされています。 ただし、計算や集計などの操作はサポートされていません。 |
ステートメント | 実行するDMLステートメント。 INSERT、UPDATE、およびDELETEステートメントのみがサポートされています。 |
使用上の注意
dbms_trans.returning()
はトランザクションステートメントではありません。 実行するDMLステートメントに基づいて、指定されたトランザクションのコンテキストを継承します。 トランザクションを終了するには、明示的にコミットまたはロールバックする必要があります。
INSERT返却
サーバーは、INSERTステートメントを使用して、指定されたテーブルに挿入されたレコードを返します。
例:
テーブル 't' の作成 (
`id` int(11) NOT NULL AUTO_INCREMENT,
'col1' int (11) NOT NULL DEFAULT '1' 、
'col2' タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP、
主要なキー ('id')
) エンジン=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列 (0.01秒)
Field_listパラメーターを指定しない場合、サーバーはOKまたはERRパケットを返します。
mysql> call dbms_trans.returning("", "insert into t(id) values(NULL),(NULL)"); クエリOK、影響を受ける2行 (0.01秒) 記録: 2重複: 0警告: 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列 (0.00秒)
戻り機能は、INSERT VALUESに似たステートメントのみをサポートします。 CREATE asやINSERT SELECTなどのステートメントはサポートされていません。
をサポートしていませんmysql> dbms_trans.returning("" 、"insert into t select * from t") を呼び出します。エラー7527 (HY000): ステートメントはRETURNING条項
UPDATE Returning
サーバーは、using UPDATEステートメントによって指定されたテーブルで更新されたレコードを返します。
例:
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列 (0.01秒)
戻る機能では、UPDATEステートメントを複数のテーブルで実行することはできません。
DELETE返却
サーバーは、DELETEステートメントを使用して、指定されたテーブルから削除されたレコードを返します。
例:
mysql> 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列 (0.00秒)