Geänderte Zeile zurückgeben (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 liefert die Werte der durch INSERT/UPDATE/DELETE geänderten Zeilen (z. B. eine automatisch erzeugte ID) ohne separates SELECT. In Oracle wird eine einzelne Zeile mit RETURNING ... INTO in eine Bind-Variable zurückgegeben, mehrere Zeilen mit RETURNING ... BULK COLLECT INTO in eine 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;Die RETURNING-Klausel in PostgreSQL ist sehr flexibel: Sie liefert beliebige Spalten (auch berechnete Ausdrücke) der von INSERT-, UPDATE-, DELETE- und MERGE-Anweisungen betroffenen Zeilen direkt als Ergebnismenge. Sie ist der sauberste Weg, erzeugte serial-/identity-Werte zu erhalten.
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 unterstützt kein Standard-RETURNING; der von einem INSERT erzeugte Auto-Increment-Schlüssel wird mit LAST_INSERT_ID() abgerufen, aktualisierte Werte werden mit einem separaten SELECT gelesen. MariaDB bietet INSERT ... RETURNING seit 10.5 und DELETE ... RETURNING seit 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;In SQL Server entspricht dem die OUTPUT-Klausel: Sie greift auf die Pseudotabellen INSERTED (neue Werte) und DELETED (alte Werte) zu; in einem UPDATE sind beide nutzbar. Mit OUTPUT ... INTO lassen sich die Ergebnisse in eine Tabelle/Tabellenvariable schreiben. Ideal, um Änderungen in eine Audit-Tabelle zu kopieren.
MongoDB
// findOneAndUpdate returns the modified document
db.employee.findOneAndUpdate(
{ id: 5 },
{ $mul: { salary: 1.1 } },
{ returnDocument: "after" } // return the updated version
)In MongoDB liefern die Befehle findOneAndUpdate / findOneAndDelete / findOneAndReplace das betroffene Dokument in einer einzigen atomaren Operation. returnDocument: 'before' liefert den Stand vor der Änderung, 'after' den Stand danach. insertOne liefert die _id des eingefügten Dokuments.
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 valueRedis hat kein separates RETURNING, aber viele Schreibbefehle liefern das Ergebnis direkt: INCR/INCRBY liefern den neuen Wert, SET ... GET den alten Wert (GETSET ist seit 6.2 veraltet) und LPOP/RPOP das entfernte Element. Für atomares Lesen-Schreiben ersetzt dieses Verhalten 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._sourceIn Elasticsearch liefern index-/update-Operationen Ergebnis-Metadaten (_id, _version, result). Um den Inhalt des aktualisierten Dokuments zu erhalten, ergänze '_source': true in der _update-Anfrage; das get-Feld der Antwort enthält dann die aktuelle _source. Ein separater GET-Aufruf ist nicht nötig.