es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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$;
  1. No estoy seguro de lo que esto significa:
IF NOT FOUND THEN return 'JUZ ISTNIEJE';
  1. 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”?
Tags:  , , ,

Answer

  1. Avatar for davy.ai
    1. La línea IF NOT FOUND THEN return ''JUZ ISTNIEJE'; intenta verificar si la declaración INSERT anterior devuelve filas con la cláusula RETURNING. Si no se devuelven filas, significa que hubo un conflicto y el INSERT no insertó realmente nada en la tabla parent_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 realmente IF NOT FOUND THEN return 'JUZ ISTNIEJE';.
    2. 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 bloque BEGIN...EXCEPTION...END en la función PL/pgSQL. Aquí tienes un ejemplo:

    CREATE OR REPLACE FUNCTION test_upsert(
      _parent_id int, 
      _some_text text)
    RETURNS text
    LANGUAGE plpgsql AS
    $func$
    DECLARE
      a text;
    BEGIN
      BEGIN
        INSERT INTO parent_tree (parent_id, some_text)
        VALUES (_parent_id, _some_text)
        ON CONFLICT (parent_id) DO NOTHING;
        a := 'ok';
      EXCEPTION WHEN unique_violation THEN
        RAISE NOTICE 'parent_id should be unique';
        a := 'not ok';
      END;
      RETURN a;
    END
    $func$;
    

    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 bloque EXCEPTION. La declaración RAISE NOTICE generará una notificación personalizada y la variable a se establecerá en 'not ok'. La función luego devuelve el valor de a. Si no hay conflictos, la función devolverá 'ok'.

Comments are closed.