Tous les produits
Search
Centre de documentation

PolarDB:Returning

Dernière mise à jour :Aug 11, 2026

Après l'exécution d'une instruction INSERT, UPDATE ou DELETE, la fonctionnalité Returning renvoie immédiatement les lignes affectées sans requête SELECT supplémentaire. Elle permet notamment de récupérer des valeurs générées par la base de données, telles que les identifiants AUTO_INCREMENT ou les valeurs DEFAULT des colonnes.

Prérequis

Avant de commencer, assurez-vous que :

  • Votre cluster PolarDB for MySQL exécute la version 5.7, révision 5.7.1.0.6 ou ultérieure. Pour vérifier votre version, consultez Interroger la version du moteur.

Fonctionnement

MySQL standard renvoie uniquement un message OK ou ERR après une instruction DML. Ce message indique le nombre de lignes affectées et analysées, mais pas leurs données. Pour inspecter ces données, vous devez généralement exécuter un SELECT supplémentaire, ce qui impose un second aller-retour vers le serveur.

La fonctionnalité Returning supprime ce second aller-retour. Appelez DBMS_TRANS.RETURNING() avec votre instruction DML et une liste de colonnes. La procédure exécute l'instruction DML et renvoie les lignes correspondantes en une seule réponse.

CALL DBMS_TRANS.RETURNING() n'est pas une instruction transactionnelle. Elle hérite du contexte de transaction de l'instruction DML transmise. Validez (commit) ou annulez (rollback) explicitement la transaction.

Syntaxe

CALL DBMS_TRANS.RETURNING(Field_list=>, Statement=>);

Paramètres

Paramètre Description
Field_list Liste des colonnes à renvoyer, séparées par des virgules, ou * pour toutes les colonnes. Les expressions de calcul et d'agrégation ne sont pas prises en charge. Transmettez une chaîne vide ("") pour supprimer le jeu de résultats et ne renvoyer que le message OK ou ERR.
Statement Instruction DML à exécuter. Types pris en charge : INSERT, UPDATE, DELETE.

Limites

  • INSERT : Seules les instructions INSERT ... VALUES sont prises en charge. Les formes INSERT ... SELECT et CREATE TABLE ... AS SELECT ne le sont pas. L'exécution d'une forme non prise en charge renvoie l'erreur ERROR 7527 (HY000): Statement didn't support RETURNING clause.

  • UPDATE : Les instructions UPDATE multi-tables ne sont pas prises en charge.

Exemples

Tous les exemples utilisent la table suivante :

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

Renvoyez toutes les colonnes des lignes insérées, y compris l'identifiant AUTO_INCREMENT id et les valeurs DEFAULT de col2 générés par la base de données :

CALL DBMS_TRANS.RETURNING("*", "insert into t(id) values(NULL),(NULL)");

Résultat :

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

Pour supprimer le jeu de résultats et ne renvoyer que le message OK ou ERR, transmettez une chaîne vide comme paramètre Field_list :

CALL DBMS_TRANS.RETURNING("", "insert into t(id) values(NULL),(NULL)");

Résultat :

Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

UPDATE

Récupérez les lignes mises à jour avec leurs nouvelles valeurs de colonnes :

CALL DBMS_TRANS.RETURNING("id, col1, col2", "update t set col1 = 2 where id > 2");

Résultat :

+----+------+---------------------+
| 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

Obtenez les lignes supprimées avec leurs valeurs antérieures à la suppression :

CALL DBMS_TRANS.RETURNING("id, col1, col2", "delete from t where id < 3");

Résultat :

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