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