pour commencer, name
est un mauvais nom pour la variable et l'attribut. Lorsque vous avez les deux, le code n'aura pas l'air bien. dans cet esprit, vous pouvez "préfixer" la variable avec un bloc étiqueté (dans l'exemple ci-dessous <<fn>>``), and set
variable_conflict` pour donner la préférence au nom de la colonne, voir le code ci-dessous :
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
et plus loin - en gros, tout le lien est à ce sujet.
Et pourtant - après avoir démontré à quel point une tâche particulière peut être facilement réalisée avec plpgsql, je cite toujours namual :