sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo eliminar la ambigüedad de un nombre de variable plpgsql en una cláusula ON CONFLICT?

para empezar, name es un mal nombre tanto para la variable como para el atributo. Cuando tienes ambos, el código no se verá bien. con eso en mente, puede "prefijar" la variable con un bloque etiquetado (en el ejemplo debajo de <<fn>>``), and set variable_conflict` para dar preferencia al nombre de la columna, vea el código a continuación:

t=# create or replace function func(
    name text
) returns void language plpgsql as
$$
#variable_conflict use_column
<<fn>>
declare name text :='blah';
begin
    insert into test (name) values (name)
    on conflict (name) do            -- this no longer fails
    update set name = fn.name;
end;
$$;
t=# insert into test select 'b';
INSERT 0 1
Time: 8.076 ms
t=# select func('b');
 func
------

(1 row)

Time: 6.117 ms
t=# select * from test;
 name
------
 b
 blah
(2 rows)

https://www.postgresql.org /docs/current/static/plpgsql-implementation.html#PLPGSQL-VAR-SUBST

y más - básicamente todo el enlace es sobre eso.

Y, sin embargo, después de demostrar cómo esta tarea en particular se puede hacer fácilmente con plpgsql, sigo citando namual: