plpgsqlで行またはレコードタイプの列を更新できます-あなたが持っているのと同じように。明らかに機能しているはずですか?
もちろん、これにより、変数ではなく、基になるテーブルが更新されます!
UPDATE my_table SET date=now() WHERE id='1';
ここで2つのことを混同しています...
コメントでの説明への回答
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$;