Det er det.
Du kan opdatere kolonner af en række eller posttype i plpgsql - ligesom du har det. Det burde åbenbart virke?
Dette ville selvfølgelig opdatere den underliggende tabel, ikke variablen!
UPDATE my_table SET date=now() WHERE id='1';
Du blander to ting sammen her ...
Svar på afklaring i kommentar
Jeg tror ikke, der er syntaks i PostgreSQL, der kan UPDATE
en hel række. Du kan UPDATE
en kolonneliste
, selvom. Overvej denne demo:
Bemærk, hvordan jeg bruger thedate
i stedet for date
som kolonnenavn, date
er et reserveret ord
i hver SQL-standard og et typenavn i 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;
Du kan dog INSERT
en hel række
let. Bare giv ikke en kolonneliste til tabellen (hvilket du normalt skal, men i dette tilfælde er det helt ok, ikke at gøre det).
Som en UPDATE
er internt en DELETE
efterfulgt af en INSERT
alligevel, og en funktion indkapsler automatisk alt i en transaktion, jeg kan ikke se, hvorfor du ikke kunne bruge dette i stedet:
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$;