sql >> Databasteknik >  >> RDS >> PostgreSQL

UPPDATERA en hel rad i PL/pgSQL

Det är det.
Du kan uppdatera kolumner för en rad eller posttyp i plpgsql - precis som du har det. Det borde väl fungera?

Detta skulle naturligtvis uppdatera den underliggande tabellen, inte variabeln!

UPDATE my_table SET date=now() WHERE id='1';

Du blandar ihop två saker här ...

Svar på förtydligande i kommentaren

Jag tror inte att det finns syntax i PostgreSQL som kan UPDATE en hel rad. Du kan UPDATE en kolumnlista , fastän. Tänk på den här demon:

Notera hur jag använder thedate istället för date som kolumnnamn, date är ett reserverat ord i varje SQL-standard och ett typnamn i 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;

Du kan dock INSERT en hel rad lätt. Ange bara inte en kolumnlista för tabellen (vilket du normalt borde, men i det här fallet är det helt ok att inte göra det).

Som en UPDATE är internt en DELETE följt av en INSERT hur som helst, och en funktion kapslar automatiskt in allt i en transaktion, jag förstår inte varför du inte kunde använda detta istället:

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


  1. Exempel på APEX_ZIP

  2. Hur man inkluderar NULL-värden i en fråga med Outer Join och Group By

  3. Anslutning av MySQL till PHP fungerar inte

  4. Öka ett värde i Postgres