Jest.
Możesz aktualizować kolumny wiersza lub typu rekordu w plpgsql - tak jak to masz. Oczywiście powinno działać?
To oczywiście zaktualizowałoby tabelę bazową, a nie zmienną!
UPDATE my_table SET date=now() WHERE id='1';
Mylisz tutaj dwie rzeczy...
Odpowiedź na wyjaśnienie w komentarzu
Nie sądzę, że w PostgreSQL istnieje składnia, która może UPDATE
cały rząd. Możesz UPDATE
lista kolumn
, chociaż. Rozważ tę prezentację:
Zwróć uwagę, jak używam thedate
zamiast date
jako nazwa kolumny, date
jest słowem zarezerwowanym
w każdym standardzie SQL i nazwę typu w 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;
Możesz jednak INSERT
cały rząd
z łatwością. Po prostu nie dostarczaj listy kolumn dla tabeli (co normalnie powinieneś, ale w tym przypadku jest całkowicie w porządku, nie).
Jako UPDATE
jest wewnętrznie DELETE
po którym następuje INSERT
w każdym razie, a funkcja automatycznie hermetyzuje wszystko w transakcji, nie rozumiem, dlaczego nie możesz użyć tego zamiast tego:
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$;