PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

AGGIORNA un'intera riga in PL/pgSQL

Lo è.
Puoi aggiornare le colonne di una riga o il tipo di record in plpgsql, proprio come hai fatto tu. Dovrebbe funzionare, ovviamente?

Ciò aggiornerebbe la tabella sottostante, ovviamente, non la variabile!

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

Stai confondendo due cose qui...

Rispondi al chiarimento nel commento

Non credo che in PostgreSQL ci sia una sintassi che possa UPDATE un'intera riga. Puoi UPDATE un elenco di colonne , anche se. Considera questa demo:

Nota come utilizzo thedate invece di date come nome della colonna, date è una parola riservata in ogni standard SQL e un nome di tipo in 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;

Tuttavia, puoi INSERT un'intera riga facilmente. Basta non fornire un elenco di colonne per la tabella (cosa che normalmente dovresti, ma in questo caso è perfettamente ok, non farlo).

Come UPDATE è internamente un DELETE seguito da un INSERT comunque, e una funzione incapsula automaticamente tutto in una transazione, non vedo perché non potresti usare questo invece:

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