PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

AKTUALISIEREN Sie eine ganze Zeile in PL/pgSQL

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$;