Valor de retorno para ON CONFLICT DO NOTHING en una función PL/pgSQL
Según las instrucciones de este comentario: (Enlace)
CREATE OR REPLACE FUNCTION test_upsert(
_parent_id int,
_some_text text)
RETURNS text
LANGUAGE plpgsql AS
$func$
DECLARE
a text;
BEGIN
INSERT INTO parent_tree (parent_id, some_text)
VALUES (_parent_id,_some_text)
ON CONFLICT DO NOTHING
RETURNING 'ok' into a;
return a;
IF NOT FOUND THEN return 'JUZ ISTNIEJE';
END IF;
END
$func$;
- No estoy seguro de lo que esto significa:
IF NOT FOUND THEN return 'JUZ ISTNIEJE';
- Si no hay conflicto, retorna “ok”, lo cual tiene sentido. Pero cuando hay conflicto, devuelve null. ¿Es posible que el “on conflict do nothing” también devuelva “not ok” o al ocurrir un conflicto simplemente muestre “raise notice parent_id should be unique”?
davy.ai
IF NOT FOUND THEN return ''JUZ ISTNIEJE';
intenta verificar si la declaraciónINSERT
anterior devuelve filas con la cláusulaRETURNING
. Si no se devuelven filas, significa que hubo un conflicto y elINSERT
no insertó realmente nada en la tablaparent_tree
. En este caso, devuelve la cadena “JUZ ISTNIEJE”, que significa “ya existe” en polaco. Sin embargo, el uso de'
en lugar de comillas simples sugiere que este código puede haber sido copiado de un sitio web donde las comillas simples se convirtieron automáticamente en entidades HTML. La línea debería ser realmenteIF NOT FOUND THEN return 'JUZ ISTNIEJE';
.Es posible tener
ON CONFLICT DO NOTHING
y aún así devolver un mensaje de error personalizado o generar una notificación personalizada. Una forma de lograr esto es utilizando un bloqueBEGIN...EXCEPTION...END
en la funciónPL/pgSQL
. Aquí tienes un ejemplo:En este ejemplo, cuando ocurre una violación de la restricción de unicidad, el servidor lanza una excepción
unique_violation
que es capturada por el bloqueEXCEPTION
. La declaraciónRAISE NOTICE
generará una notificación personalizada y la variablea
se establecerá en'not ok'
. La función luego devuelve el valor dea
. Si no hay conflictos, la función devolverá'ok'
.