Vysvětlení je, podle manuálu :
Tělo DO
příkaz je řetězec v dolarech. Takže žádná interpolace uvnitř řetězce.
Vzhledem k tomu, že se musí jednat o doslovný řetězec, také nelze řetězce zřetězit za běhu. Příručka:
Ale můžete řetězec zřetězit a pak jej spustit.
Odvážný důraz můj. Musíte jen správně citovat:
test=# \set test 'some value'
test=# \set code 'DECLARE v_test text := ' :'test' '; BEGIN RAISE NOTICE ''test var is: %'', v_test; END'
test=# DO :'code';
NOTICE: test var is: some value
DO
test=#
Ale raději bych vytvořil (dočasnou) funkci a předal hodnotu jako parametr (kde funguje interpolace psql). Podrobnosti v této související odpovědi na dba.SE: