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: