このトピックでは、AliSQLのReturning機能について説明します。 この機能により、データ操作言語 (DML) ステートメントは結果セットを返すことができ、DMLステートメントの実行を追跡するためのDBMS_TRANSパッケージを提供します。
背景情報
MySQL文の実行結果は、結果セット、OKパケット、ERRパケットの3つのタイプに分けられます。 OKまたはERRパケットには、影響を受けるレコードの数やスキャンされたレコードの数などの属性が含まれます。 ただし、DMLステートメント (INSERT、UPDATE、またはDELETE) の実行に続いて、現在のレコードを照会するSELECTステートメントが実行されることがよくあります。 このような場合、Returning機能を使用すると、サーバーは2つのステートメントの実行結果を組み合わせて結果セットにすることで、クライアントに1回だけ応答できます。
前提条件
RDSインスタンスは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秒)
- Returning機能は、
INSERT VALUES
に似たステートメントのみをサポートします。CREATE as
やINSERT SELECT
などのステートメントはサポートされていません。
をサポートしていませんmysql> dbms_trans.returning("" 、"insert into t select * from t") を呼び出します。エラー7527 (HY000): ステートメントは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秒)
戻りを削除
サーバーは、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秒)