La spiegazione è secondo il manuale :
Il corpo del DO
statement è una stringa tra virgolette. Quindi nessuna interpolazione all'interno della stringa.
Poiché deve essere una stringa letterale, non è possibile concatenare le stringhe al volo. Il manuale:
Ma puoi concatenare la stringa e quindi eseguirla.
Enfasi in grassetto mio. Devi solo ottenere la quotazione giusta:
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=#
Ma preferirei creare una funzione (temporanea) e passare il valore come parametro (dove funziona l'interpolazione psql). Dettagli in questa risposta correlata su dba.SE: