Salah satu opsi untuk tetap menggunakan pembaruan dan masih mengembalikan baris yang berkonflik adalah membuat fungsi yang melakukan pemeriksaan ini sebelum Anda melakukan pembaruan. Jika kunci utama sudah ada, ia mengembalikan baris yang bertentangan, dan Jika tidak, baris akan diperbarui. Contoh dari fungsi tersebut dapat berupa:
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');
EDIT :Jika tidak ada konflik dan Anda masih menginginkan RETURNING *
, cukup tambahkan RETURN QUERY
ke UPDATE
pernyataan:
...
RETURN QUERY
UPDATE sentence SET content = cont, language_id= lang WHERE id = idp
RETURNING *;
...