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

PostgreSQL - Restituisce il contenuto della riga quando UPDATE non riesce

Un'opzione per continuare a utilizzare l'aggiornamento e restituire comunque le righe in conflitto consiste nel creare una funzione che esegua questo controllo prima di eseguire l'aggiornamento. Nel caso in cui la chiave primaria esista già, restituisce la riga in conflitto e, in caso contrario, la riga viene aggiornata. Un esempio di tale funzione potrebbe essere:

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

MODIFICA :Se non ci sono conflitti e vuoi comunque il RETURNING * , aggiungi semplicemente una RETURN QUERY al UPDATE dichiarazione:

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