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ステートメント。 次のステートメントがサポートされています。
|
例
次の例では、次のステートメントを実行して作成されるテーブル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 as
やinsert 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秒)