PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment lever l'ambiguïté d'un nom de variable plpgsql dans une clause ON CONFLICT ?

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 :