Penjelasannya adalah, sesuai manual :
Tubuh DO
pernyataan adalah string yang dikutip dolar. Jadi tidak ada interpolasi di dalam string.
Karena harus berupa string literal, Anda juga tidak dapat menggabungkan string dengan cepat. Manual:
Tetapi Anda dapat menggabungkan string dan kemudian menjalankannya.
Penekanan saya yang berani. Anda hanya perlu mendapatkan kutipan yang benar:
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=#
Tapi saya lebih suka membuat fungsi (sementara) dan meneruskan nilai sebagai parameter (tempat interpolasi psql berfungsi). Detail dalam jawaban terkait ini di dba.SE: