すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:戻る

最終更新日:Jan 11, 2024

このトピックでは、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 asINSERT 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秒) 
説明 Returning機能では、UPDATEステートメントを複数のテーブルで実行することはできません。

戻りを削除

サーバーは、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秒)