Руководство для psql:
Переменная интерполяция не будет выполняться в пределах указанных литералов SQL и идентификаторов.
Тело оператора * (или функции) DO
является литералом в кавычках. Доллар в данном случае цитируется, но все равно.
Мне пришлось дать такой же отрицательный ответ в этом недавнем ответе на dba.SE:
Но есть различные обходные пути, и я предоставил некоторые там.
ЛегкоНапример, для вашего случая можно создать временную функцию вместо оператора DO
и сразу вызвать ее. Тогда вы можете легко передавать переменные. Запишите это в свой файл test.psql
:
CREATE FUNCTION pg_temp.foo(_v1 text)
RETURNS void AS -- can also return sth. (as opposed to DO)
$func$
DECLARE
user_c cursor is
SELECT username
FROM users
WHERE upper(_v1) IN ('ALL', upper(component_id))
ORDER BY username;
BEGIN
RAISE NOTICE '%', _v1; -- to demonstrate
-- more
END
$func$ LANGUAGE plpgsql;
SELECT pg_temp.foo(:'v1'); -- call with psql variable interpolation
Затем вызовите его из psql или непосредственно из оболочки:
Оболочка Linux:
psql -f '\path\to\file\test.psql' -v v1='SR'
Оболочка Windows:
"C:\Program Files\PostgreSQL\12\bin\psql" -p 5432 -U postgres -f "C:\path\to\file\test.psql" -v v1='SR'
Адаптировать пути к файлам и параметры подключения к вашим настройкам.
Помимо: postgresql-9.2 , серьезно? Не поддерживается с 2017 года. Рассмотрите возможность обновления до текущей версии.