PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie disambiguiert man einen plpgsql-Variablennamen in einer ON CONFLICT-Klausel?

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: