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

PostgreSQL - Returner rækkeindholdet, når OPDATERING mislykkes

En mulighed for at blive ved med at bruge opdatering og stadig returnere de modstridende rækker ville være at oprette en funktion, der udfører denne kontrol, før du udfører opdateringen. Hvis den primære nøgle allerede eksisterer, returnerer den den modstridende række, og hvis ikke, bliver rækken opdateret. Et eksempel på en sådan funktion kunne være:

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');

REDIGER :Hvis der ikke er nogen konflikt, og du stadig ønsker RETURNING * , skal du blot tilføje en RETURN QUERY til UPDATE erklæring:

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



  1. Sådan opretter du indlejret tabel som databaseobjekt i Oracle

  2. Dataadgang fra Raspberry Pi

  3. Python MySQLdb itererer gennem tabellen

  4. Hvad er fordele og ulemper ved at holde SQL i Stored Procs versus kode