PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

ATUALIZE uma linha inteira em PL/pgSQL


É.
Você pode atualizar colunas de uma linha ou tipo de registro em plpgsql - exatamente como você tem. Deve estar funcionando, obviamente?

Isso atualizaria a tabela subjacente, é claro, não a variável!
UPDATE my_table SET date=now() WHERE id='1';

Você está confundindo duas coisas aqui...

Resposta ao esclarecimento no comentário


Eu não acho que haja sintaxe no PostgreSQL que possa UPDATE uma fileira inteira. Você pode UPDATE uma lista de colunas , no entanto. Considere esta demonstração:

Observe como eu uso thedate em vez de date como nome da coluna, date é uma palavra reservada em cada padrão SQL e um nome de tipo no PostgreSQL.
CREATE TEMP TABLE my_table (id serial, thedate date);
INSERT INTO my_table(thedate) VALUES (now());

CREATE OR REPLACE FUNCTION test_up()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 5 ;

   UPDATE my_table t
    -- explicit list of columns to be to updated
   SET   (id, thedate) = (_r.id, _r.thedate)
   WHERE  t.id = 1;
END
$func$;

SELECT test_up();
SELECT * FROM my_table;

No entanto, você pode INSERT uma linha inteira facilmente. Apenas não forneça uma lista de colunas para a tabela (o que você normalmente deveria, mas neste caso está perfeitamente ok, não).

Como uma UPDATE é internamente um DELETE seguido por um INSERT de qualquer forma, e uma função encapsula automaticamente tudo em uma transação, não vejo por que você não poderia usar isso:
CREATE OR REPLACE FUNCTION x.test_ delins()
  RETURNS void LANGUAGE plpgsql AS
$func$
DECLARE
    _r my_table;
BEGIN
   SELECT * INTO _r
   FROM my_table WHERE id = 1;
   _r.thedate := now()::date + 10;

   DELETE FROM my_table t WHERE t.id = 1;
   INSERT INTO my_table SELECT _r.*;
END
$func$;