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

PolarDB:戻る

最終更新日:May 24, 2024

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秒)