Beginnen Sie mit name
ist ein schlechter Name für Variable und Attribut. Wenn Sie beide haben, sieht der Code nicht gut aus. In diesem Sinne können Sie der Variablen einen beschrifteten Block voranstellen (im Beispiel unten <<fn>>``), and set
variable_conflict`, um dem Spaltennamen den Vorzug zu geben, siehe Code unten:
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
und weiter - im Grunde dreht sich der ganze Link darum.
Und doch - nachdem ich gezeigt habe, wie einfach diese Aufgabe mit plpgsql erledigt werden kann, zitiere ich immer noch namual: