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