DBAtlas · Atlas d'exploitation des bases de données

Renvoyer la ligne modifiée (RETURNING / OUTPUT)

Oracle

-- Single row: RETURNING ... INTO (PL/SQL bind variable)
UPDATE employee SET salary = salary * 1.1
WHERE id = 5
RETURNING salary INTO :new_salary;

-- Get back the key generated by an INSERT
INSERT INTO employee (name) VALUES ('Ayse')
RETURNING id INTO :new_id;

RETURNING renvoie les valeurs des lignes modifiées par INSERT/UPDATE/DELETE (par ex. un ID généré automatiquement) sans SELECT séparé. Dans Oracle, une seule ligne est renvoyée avec RETURNING ... INTO une variable de liaison, et plusieurs lignes avec RETURNING ... BULK COLLECT INTO une collection.

PostgreSQL

INSERT INTO employee (name, salary)
VALUES ('Ayse', 15000)
RETURNING id, name;

UPDATE employee SET salary = salary * 1.1
WHERE department = 'IT'
RETURNING id, salary;

La clause RETURNING de PostgreSQL est très souple : elle renvoie directement sous forme de jeu de résultats n'importe quelle colonne (expressions calculées comprises) des lignes affectées par les instructions INSERT, UPDATE, DELETE et MERGE. C'est le moyen le plus propre d'obtenir les valeurs serial/identity générées.

MySQL

-- MySQL has no RETURNING; the generated key is retrieved separately:
INSERT INTO employee (name, salary) VALUES ('Ayse', 15000);
SELECT LAST_INSERT_ID();

-- MariaDB 10.5+ supports INSERT ... RETURNING:
INSERT INTO employee (name) VALUES ('Ayse') RETURNING id;

MySQL ne prend pas en charge le RETURNING standard ; la clé auto-incrémentée générée par un INSERT s'obtient avec LAST_INSERT_ID(), et les valeurs mises à jour se lisent avec un SELECT séparé. MariaDB propose INSERT ... RETURNING depuis 10.5 et DELETE ... RETURNING depuis 10.0.

SQL Server

INSERT INTO employee (name, salary)
OUTPUT INSERTED.id, INSERTED.name
VALUES ('Ayse', 15000);

UPDATE employee SET salary = salary * 1.1
OUTPUT DELETED.salary AS old_salary, INSERTED.salary AS new_salary
WHERE id = 5;

L'équivalent dans SQL Server est la clause OUTPUT : elle accède aux pseudo-tables INSERTED (nouvelles valeurs) et DELETED (anciennes valeurs) ; les deux peuvent être utilisées dans un UPDATE. Avec OUTPUT ... INTO, les résultats peuvent être écrits dans une table/variable de table. Idéal pour copier les modifications dans une table d'audit.

MongoDB

// findOneAndUpdate returns the modified document
db.employee.findOneAndUpdate(
  { id: 5 },
  { $mul: { salary: 1.1 } },
  { returnDocument: "after" }   // return the updated version
)

Dans MongoDB, les commandes findOneAndUpdate / findOneAndDelete / findOneAndReplace renvoient le document affecté en une seule opération atomique. returnDocument: 'before' donne la version avant la modification, 'after' la version après. insertOne renvoie le _id du document inséré.

Redis

# Some commands return the old/new value directly:
SET counter 0 GET       # (6.2+) returns the old value and writes the new one (replaces GETSET)
INCR visits          # increments and returns the new value

Redis n'a pas de RETURNING distinct, mais de nombreuses commandes d'écriture renvoient directement le résultat : INCR/INCRBY renvoient la nouvelle valeur, SET ... GET l'ancienne valeur (GETSET est déprécié depuis 6.2), et LPOP/RPOP l'élément retiré. Pour une lecture-écriture atomique, ce comportement remplace RETURNING.

Elasticsearch

# The _update response can return the result:
POST employee/_update/5
{
  "script": { "source": "ctx._source.salary *= 1.1" },
  "_source": true
}
# The response returns the updated document in get._source

Dans Elasticsearch, les opérations index/update renvoient des métadonnées de résultat (_id, _version, result). Pour obtenir le corps du document mis à jour, ajoutez '_source': true à la requête _update ; le champ get de la réponse contient le _source actuel. Aucun appel GET séparé n'est nécessaire.

Ouvrir dans DBAtlas →