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

PolarDB:戻る

最終更新日:Jun 04, 2024

PolarDBは、返却機能を提供します。 DMLステートメントを実行すると、resultsetが返されます。 このトピックでは、PolarDBの返却機能の使用方法について説明します。

前提条件

PolarDBクラスターのバージョンはPolarDB for MySQL 5.7、リビジョンバージョンは5.7.1.0.6以降です。 バージョンの確認方法の詳細については、「エンジンバージョンの照会」をご参照ください。

背景情報

通常、OKまたはERRメッセージは、MySQLでDMLステートメントを実行した後に返されます。 これらのメッセージには、管理行とスキャン行の番号のみが含まれます。 これらのデータレコードのresultsetは返されません。 ただし、ほとんどの場合、INSERT、UPDATE、DELETEなどのDMLステートメントを実行した後、エラーが発生した場合にデータレコードをチェックするためにSELECTステートメントを実行する必要があります。 これにより、DML操作とデータの精度が保証されます。

クライアントとサーバー間のやり取りの数を減らし、MySQL構文との互換性を確保するために、PolarDBにはReturning機能があります。 DMLステートメントを実行すると、resultsetが返されます。

構文

CALL DBMS_TRANS.RETURNING(Field_list =>, Statement=>);
説明 CALL DBMS_TRANS.RETURNING() ステートメントはトランザクションステートメントではありません。 ステートメントは、実行するDMLステートメントに基づいて、トランザクションのコンテキストを継承します。 トランザクションをコミットまたはロールバックする必要があります。

下表に、各パラメーターを説明します。

パラメーター説明
フィールド_リスト返される列。The columns to be returns. 複数の列はコンマ (,) で区切ります。 列は次の要件を満たす必要があります。
  • テーブル内の既存の列、またはすべての列を指定するアスタリスク (*) のみがサポートされます。
  • 列の計算や集計などの操作はサポートされていません。
ステートメント実行されるDMLステートメント。 次のステートメントがサポートされています。
  • INSERT
  • UPDATE
  • DELETE

次の例では、次のステートメントを実行して作成されるテーブルtを使用します。 これらの例では、Returning機能を使用してDMLステートメントのresultsetを返す方法について説明します。

テーブル 't' の作成 (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  'col1' int (11) NOT NULL DEFAULT '1' 、
  'col2' タイムスタンプNOT NULL DEFAULT CURRENT_TIMESTAMP、
  主要なキー ('id')
) エンジン=InnoDB; 
  • INSERT
    説明 INSERTステートメントにReturn機能を使用すると、insert valuesステートメントのみがサポートされます。 create asinsert selectなどの文はサポートされていません。 たとえば、CALL DBMS_TRANS.RETURNING("", "insert into t select * from t"); を実行すると、error 7527 (HY000): ステートメントがサポートされていないRETURNING句などのエラーが発生します。
    次のステートメントを実行して、INSERTステートメントによって挿入されるデータレコードを表示します。
    CALL DBMS_TRANS.RETURNING("*", "insert (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を空の文字列に設定した場合、call dbms_trans.returning("", "insert into t(id) values(NULL),(NULL)"); ステートメントを実行すると、OKまたはERRメッセージのみが返されます。 例:
    OKクエリ、影響を受ける2行 (0.01秒)
    記録: 2重複: 0警告: 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列 (0.00秒) 
  • 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列 (0.01秒) 
  • 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列 (0.00秒)