PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Come disambiguare un nome di variabile plpgsql in una clausola ON CONFLICT?

per cominciare, name è un brutto nome sia per la variabile che per l'attributo. Quando hai entrambi, il codice non avrà un bell'aspetto. con questo in mente, puoi "prefissare" la variabile con il blocco etichettato (nell'esempio sotto <<fn>>``), and set variable_conflict` per dare la preferenza al nome della colonna, vedere il codice seguente:

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 inoltre - fondamentalmente l'intero collegamento riguarda questo.

Eppure, dopo aver dimostrato come questo compito particolare possa essere facilmente svolto con plpgsql, cito ancora namual: