PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como desambiguar um nome de variável plpgsql em uma cláusula ON CONFLICT?


para começar, name é um nome ruim para variável e atributo. Quando você tem ambos, o código não ficará bom. com isso em mente, você pode "prefixar" a variável com o bloco rotulado (no exemplo abaixo <<fn>>``), and set variable_conflict` para dar preferência ao nome da coluna, veja o código abaixo:
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

e mais - basicamente todo o link é sobre isso.

E ainda - depois de demonstrar como uma tarefa específica pode ser feita facilmente com o plpgsql, ainda cito namual: