PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

MISE À JOUR d'une ligne entière en PL/pgSQL

C'est le cas.
Vous pouvez mettre à jour les colonnes d'une ligne ou d'un type d'enregistrement dans plpgsql - comme vous l'avez fait. Cela devrait fonctionner, évidemment ?

Cela mettrait à jour la table sous-jacente, bien sûr, pas la variable !

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

Vous confondez deux choses ici...

Réponse à la clarification en commentaire

Je ne pense pas qu'il existe une syntaxe dans PostgreSQL qui puisse UPDATE toute une rangée. Vous pouvez UPDATE une liste de colonnes , pourtant. Considérez cette démo :

Notez comment j'utilise thedate au lieu de date comme nom de colonne, date est un mot réservé dans chaque standard SQL et un nom de type dans 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;

Cependant, vous pouvez INSERT une ligne entière facilement. Ne fournissez simplement pas de liste de colonnes pour la table (ce que vous devriez normalement faire, mais dans ce cas, c'est tout à fait correct).

En tant que UPDATE est en interne un DELETE suivi d'un INSERT de toute façon, et une fonction encapsule automatiquement tout dans une transaction, je ne vois pas pourquoi vous ne pourriez pas utiliser ceci à la place :

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