Обяснението е, според ръководството :
Тялото на DO
операторът е низ в доларови кавички. Така че няма интерполация вътре в низа.
Тъй като трябва да е буквален низ, вие също не можете да свързвате низове в движение. Ръководството:
Но можете да свържете низа и след това да го изпълните.
Удебелен акцент мой. Просто трябва да направите правилното цитиране:
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=#
Но бих предпочел да създам (временна) функция и да предам стойността като параметър (където работи psql интерполацията). Подробности в този свързан отговор на dba.SE: