sql >> Database teknologi >  >> RDS >> PostgreSQL

OPDATERE en hel række i PL/pgSQL

Det er det.
Du kan opdatere kolonner af en række eller posttype i plpgsql - ligesom du har det. Det burde åbenbart virke?

Dette ville selvfølgelig opdatere den underliggende tabel, ikke variablen!

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

Du blander to ting sammen her ...

Svar på afklaring i kommentar

Jeg tror ikke, der er syntaks i PostgreSQL, der kan UPDATE en hel række. Du kan UPDATE en kolonneliste , selvom. Overvej denne demo:

Bemærk, hvordan jeg bruger thedate i stedet for date som kolonnenavn, date er et reserveret ord i hver SQL-standard og et typenavn 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 dog INSERT en hel række let. Bare giv ikke en kolonneliste til tabellen (hvilket du normalt skal, men i dette tilfælde er det helt ok, ikke at gøre det).

Som en UPDATE er internt en DELETE efterfulgt af en INSERT alligevel, og en funktion indkapsler automatisk alt i en transaktion, jeg kan ikke se, hvorfor du ikke kunne bruge dette i stedet:

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. skriv en forespørgsel, der gælder for en hel db i stedet for en tabel

  2. Efter en PostgreSQL-gendannelse får jeg tilladelse nægtet til relation django_session

  3. Opret forbindelse til MySQL over SSH ved hjælp af Java

  4. Udførelse af en lagret procedure ved hjælp af Windows Task Scheduler