sql >> Base de Datos >  >> RDS >> PostgreSQL

ACTUALIZAR una fila completa en PL/pgSQL

Lo es.
Puede actualizar columnas de una fila o tipo de registro en plpgsql, tal como lo tiene. Debería estar funcionando, obviamente?

¡Esto actualizaría la tabla subyacente, por supuesto, no la variable!

UPDATE my_table SET date=now() WHERE id='1';

Estás confundiendo dos cosas aquí...

Respuesta a aclaración en comentario

No creo que haya una sintaxis en PostgreSQL que pueda UPDATE una fila entera. Puede UPDATE una lista de columnas , aunque. Considere esta demostración:

Tenga en cuenta cómo uso thedate en lugar de date como nombre de columna, date es una palabra reservada en cada estándar SQL y un nombre de tipo en 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;

Sin embargo, puede INSERT toda una fila fácilmente. Simplemente no proporcione una lista de columnas para la tabla (que normalmente debería hacerlo, pero en este caso está perfectamente bien, no hacerlo).

Como una UPDATE es internamente un DELETE seguido de INSERT de todos modos, y una función encapsula automáticamente todo en una transacción, no veo por qué no podría usar esto en su lugar:

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$;