Después de ejecutar una instrucción INSERT, UPDATE o DELETE, la función Returning devuelve las filas afectadas de inmediato, sin necesidad de un SELECT posterior. Esto resulta útil para recuperar valores generados por la base de datos, como identificadores AUTO_INCREMENT o valores DEFAULT de columnas.
Requisitos previos
Antes de empezar, asegúrese de que:
Su clúster de PolarDB for MySQL ejecute la versión 5.7 con la versión de revisión 5.7.1.0.6 o posterior. Para comprobar su versión, consulte Query the engine version.
Cómo funciona
MySQL estándar solo devuelve un mensaje OK o ERR después de una instrucción DML. Este mensaje incluye el número de filas afectadas y examinadas, pero no los datos reales de las filas. Para inspeccionar los datos, normalmente se ejecuta un SELECT posterior, lo que implica un segundo viaje de ida y vuelta al servidor.
La función Returning elimina ese segundo viaje de ida y vuelta. Llame a DBMS_TRANS.RETURNING() con su instrucción DML y una lista de columnas. El procedimiento ejecuta la instrucción DML y devuelve las filas coincidentes en una sola respuesta.
CALL DBMS_TRANS.RETURNING() no es una instrucción transaccional. Hereda el contexto de transacción de la instrucción DML que usted pase. Confirme o revierta la transacción de forma explícita.
Sintaxis
CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);
Parámetros
|
Parámetro |
Descripción |
|
|
Lista de columnas separadas por comas que se van a devolver, o bien |
|
|
La instrucción DML que se va a ejecutar. Tipos compatibles: INSERT, UPDATE y DELETE. |
Limitaciones
INSERT: Solo se admiten instrucciones
INSERT ... VALUES. Las instruccionesINSERT ... SELECTyCREATE TABLE ... AS SELECTno son compatibles. Si ejecuta una variante no compatible, se devuelveERROR 7527 (HY000): Statement didn't support RETURNING clause.UPDATE: No se admiten instrucciones UPDATE de varias tablas.
Ejemplos
Todos los ejemplos usan la siguiente tabla:
CREATE TABLE `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col1` int(11) NOT NULL DEFAULT '1',
`col2` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB;
INSERT
Devuelva todas las columnas de las filas insertadas, incluidos los valores AUTO_INCREMENT de id y DEFAULT de col2 generados por la base de datos:
CALL DBMS_TRANS.RETURNING("*", "insert into t(id) values(NULL),(NULL)");
Resultado:
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 1 | 1 | 2019-09-03 10:39:05 |
| 2 | 1 | 2019-09-03 10:39:05 |
+----+------+---------------------+
2 rows in set (0.01 sec)
Para suprimir el conjunto de resultados y devolver únicamente el mensaje OK o ERR, pase una cadena vacía como Field_list:
CALL DBMS_TRANS.RETURNING("", "insert into t(id) values(NULL),(NULL)");
Resultado:
Query OK, 2 rows affected (0.01 sec)
Records: 2 Duplicates: 0 Warnings: 0
UPDATE
Devuelva las filas actualizadas con sus nuevos valores de columna:
CALL DBMS_TRANS.RETURNING("id, col1, col2", "update t set col1 = 2 where id > 2");
Resultado:
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 3 | 2 | 2019-09-03 10:41:06 |
| 4 | 2 | 2019-09-03 10:41:06 |
+----+------+---------------------+
2 rows in set (0.01 sec)
DELETE
Devuelva las filas eliminadas con los valores que tenían antes de la eliminación:
CALL DBMS_TRANS.RETURNING("id, col1, col2", "delete from t where id < 3");
Resultado:
+----+------+---------------------+
| id | col1 | col2 |
+----+------+---------------------+
| 1 | 1 | 2019-09-03 10:40:55 |
| 2 | 1 | 2019-09-03 10:40:55 |
+----+------+---------------------+
2 rows in set (0.00 sec)