Após executar uma instrução INSERT, UPDATE ou DELETE, o recurso Returning devolve as linhas afetadas imediatamente, sem exigir uma consulta SELECT subsequente. Esse recurso é útil para recuperar valores gerados pelo banco de dados, como IDs AUTO_INCREMENT ou valores DEFAULT de colunas.
Pré-requisitos
Antes de começar, verifique se:
Seu cluster PolarDB for MySQL executa a versão 5.7 com revisão 5.7.1.0.6 ou posterior. Para verificar a versão, consulte Consultar a versão do mecanismo.
Como funciona
O MySQL padrão retorna apenas uma mensagem OK ou ERR após uma instrução DML. Essa mensagem inclui o número de linhas afetadas e verificadas, mas não os dados reais das linhas. Para inspecionar os dados, normalmente você precisa executar um SELECT subsequente, o que gera uma segunda viagem de ida e volta ao servidor.
O recurso Returning elimina essa segunda viagem. Chame DBMS_TRANS.RETURNING() com sua instrução DML e uma lista de colunas. O procedimento executa a DML e retorna as linhas correspondentes em uma única resposta.
CALL DBMS_TRANS.RETURNING() não é uma instrução transacional. Ela herda o contexto de transação da instrução DML fornecida. Confirme (commit) ou reverta (rollback) a transação explicitamente.
Sintaxe
CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);
Parâmetros
|
Parâmetro |
Descrição |
|
|
Lista de colunas separadas por vírgula a retornar, ou |
|
|
Instrução DML a executar. Tipos compatíveis: INSERT, UPDATE, DELETE. |
Limitações
INSERT: Há suporte apenas para instruções
INSERT ... VALUES. Não há suporte paraINSERT ... SELECTeCREATE TABLE ... AS SELECT. Executar uma forma incompatível retornaERROR 7527 (HY000): Statement didn't support RETURNING clause.UPDATE: Não há suporte para instruções UPDATE de múltiplas tabelas.
Exemplos
Todos os exemplos usam a seguinte tabela:
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
Retorne todas as colunas das linhas inseridas, incluindo o id AUTO_INCREMENT e os valores DEFAULT de col2 gerados pelo banco de dados:
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 o conjunto de resultados e retornar apenas a mensagem OK ou ERR, passe uma string vazia 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
Retorne as linhas atualizadas com os novos valores de coluna:
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
Retorne as linhas excluídas com os valores anteriores à exclusão:
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)