sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur disambiguerar man ett plpgsql-variabelnamn i en ON CONFLICT-sats?

till att börja med, name är ett dåligt namn för både variabel och attribut. När du har båda ser koden inte bra ut. med det i åtanke kan du "prefixa" variabel med märkt block (i exemplet nedan <<fn>>``), and set variabel_konflikt` för att ge företräde åt kolumnnamn, se kod nedan:

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

och vidare - i princip hela länken handlar om det.

Och ändå - efter att ha visat hur en speciell uppgift detta enkelt kan göras med plpgsql, citerar jag fortfarande namual:



  1. PHPExcel:Ogiltigt cellkoordinatfel

  2. inklusive saknade (nollantal) rader när du använder GROUP BY

  3. En datamodell för djurvård

  4. Oracle-problem med rapportering av SQL