Wyjaśnienie jest, zgodnie z instrukcją :
Treść DO
oświadczenie jest ciągiem w cudzysłowie w dolarach. Więc nie ma interpolacji wewnątrz ciągu.
Ponieważ musi to być dosłowny ciąg, nie można również łączyć ciągów w locie. Instrukcja:
Ale możesz połączyć ciąg, a następnie go wykonać.
Moje odważne podkreślenie. Musisz tylko poprawnie cytować:
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 wolałbym utworzyć funkcję (tymczasową) i przekazać wartość jako parametr (gdzie działa interpolacja psql). Szczegóły w tej powiązanej odpowiedzi na dba.SE: