Така е.
Можете да актуализирате колони от тип ред или запис в plpgsql - точно както го имате. Очевидно трябва да работи?
Това би актуализирало основната таблица, разбира се, не променливата!
UPDATE my_table SET date=now() WHERE id='1';
Тук бъркате две неща...
Отговор на пояснение в коментар
Не мисля, че има синтаксис в PostgreSQL, който може да UPDATE
цял ред. Можете да UPDATE
списък с колони
, обаче. Помислете за тази демонстрация:
Обърнете внимание как използвам thedate
вместо date
като име на колона, date
е запазена дума
във всеки SQL стандарт и име на тип в 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;
Можете обаче да INSERT
цял ред
лесно. Просто не предоставяйте списък с колони за таблицата (което обикновено трябва, но в този случай е напълно добре да не го правите).
Като UPDATE
е вътрешно DELETE
последвано от INSERT
както и да е, и функция автоматично капсулира всичко в транзакция, не виждам защо не можете да използвате това вместо това:
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$;