sql >> Database >  >> RDS >> PostgreSQL

PostgreSQL - Retourneert de rij-inhoud wanneer UPDATE mislukt

Een optie om update te blijven gebruiken en toch de conflicterende rijen terug te geven, zou zijn om een ​​functie te maken die deze controle uitvoert voordat u de update uitvoert. Als de primaire sleutel al bestaat, wordt de conflicterende rij geretourneerd, en zo niet, dan wordt de rij bijgewerkt. Een voorbeeld van zo'n functie zou kunnen zijn:

CREATE OR REPLACE FUNCTION my_func(cont TEXT, lang INT, idp TEXT) 
RETURNS SETOF sentence AS $$
DECLARE j RECORD;
BEGIN
  SELECT * FROM sentence WHERE content = cont AND 
                               language_id = lang INTO j;
  IF j IS NOT NULL THEN 
    RETURN NEXT j;
  ELSE
    RETURN QUERY UPDATE sentence SET content = cont, language_id= lang 
                 WHERE id = idp RETURNING *;
  END IF;
  EXCEPTION WHEN SQLSTATE '23505' THEN 
  RETURN QUERY SELECT * FROM sentence WHERE content = cont AND
                                            language_id= lang;
END$$ LANGUAGE plpgsql;

SELECT my_func('This is a sentence',834,'0538f24a-2046-4da6-933d-409aa7b7c597');

BEWERKEN :Als er geen conflict is en u wilt toch de RETURNING * , voeg gewoon een RETURN QUERY toe naar de UPDATE verklaring:

...    
RETURN QUERY 
UPDATE sentence SET content = cont, language_id= lang WHERE id = idp 
RETURNING *;
...



  1. mysql-fout tijdens het invoegen van een afbeelding in de mysql-database

  2. Android biometrische USB-vingerafdrukverificatie tutorial

  3. Hoe com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException op te lossen:Geen bewerkingen toegestaan ​​nadat de verbinding is gesloten. uitzondering?

  4. MySQLdb via proxy