Das ist es.
Sie können Spalten einer Zeile oder eines Datensatztyps in plpgsql aktualisieren - genau so, wie Sie es haben. Es sollte offensichtlich funktionieren?
Dies würde natürlich die zugrunde liegende Tabelle aktualisieren, nicht die Variable!
UPDATE my_table SET date=now() WHERE id='1';
Sie verwechseln hier zwei Dinge ...
Antwort auf Klarstellung im Kommentar
Ich glaube nicht, dass es in PostgreSQL eine Syntax gibt, die UPDATE
kann eine ganze Reihe. Sie können UPDATE
eine Spaltenliste
, obwohl. Sehen Sie sich diese Demo an:
Beachten Sie, wie ich thedate
verwende statt date
als Spaltenname date
ist ein reserviertes Wort
in jedem SQL-Standard und einen Typnamen 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;
Sie können jedoch INSERT
eine ganze Reihe
leicht. Geben Sie einfach keine Spaltenliste für die Tabelle an (was Sie normalerweise tun sollten, aber in diesem Fall ist es völlig in Ordnung, dies nicht zu tun).
Als UPDATE
ist intern ein DELETE
gefolgt von einem INSERT
sowieso, und eine Funktion kapselt automatisch alles in einer Transaktion ein, ich verstehe nicht, warum Sie das nicht stattdessen verwenden könnten:
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$;