Retornar a linha modificada (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 retorna os valores das linhas alteradas por INSERT/UPDATE/DELETE (ex.: um ID gerado automaticamente) sem um SELECT separado. No Oracle, uma única linha é retornada com RETURNING ... INTO uma bind variable, e várias linhas com RETURNING ... BULK COLLECT INTO uma coleção.
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;A cláusula RETURNING do PostgreSQL é muito flexível: retorna diretamente como conjunto de resultados qualquer coluna (incluindo expressões calculadas) das linhas afetadas por instruções INSERT, UPDATE, DELETE e MERGE. É a forma mais limpa de obter valores serial/identity gerados.
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;O MySQL não suporta o RETURNING padrão; a chave auto-incremento gerada por um INSERT é obtida com LAST_INSERT_ID(), e os valores atualizados são lidos com um SELECT separado. O MariaDB oferece INSERT ... RETURNING desde o 10.5 e DELETE ... RETURNING desde o 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;O equivalente no SQL Server é a cláusula OUTPUT: ela acessa as pseudotabelas INSERTED (novos valores) e DELETED (valores antigos); ambas podem ser usadas em um UPDATE. Com OUTPUT ... INTO, os resultados podem ser gravados em uma tabela/variável de tabela. Ideal para copiar as alterações para uma tabela de auditoria.
MongoDB
// findOneAndUpdate returns the modified document
db.employee.findOneAndUpdate(
{ id: 5 },
{ $mul: { salary: 1.1 } },
{ returnDocument: "after" } // return the updated version
)No MongoDB, os comandos findOneAndUpdate / findOneAndDelete / findOneAndReplace retornam o documento afetado em uma única operação atômica. returnDocument: 'before' fornece a versão anterior à alteração; 'after', a versão posterior. insertOne retorna o _id do documento inserido.
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 valueO Redis não tem um RETURNING separado, mas muitos comandos de escrita retornam o resultado diretamente: INCR/INCRBY retornam o novo valor, SET ... GET o valor antigo (GETSET está obsoleto desde o 6.2), e LPOP/RPOP o elemento removido. Para leitura-escrita atômica, esse comportamento substitui o 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._sourceNo Elasticsearch, as operações index/update retornam metadados do resultado (_id, _version, result). Para obter o corpo do documento atualizado, adicione '_source': true à requisição _update; o campo get da resposta contém o _source atual. Não é necessária uma chamada GET separada.