2016-06-09 2 views
2

Моего SQL скрипт содержит следующее:использования набор переменные внутри plpgsql объявляет блок

\set test 'some value' 
DO $$DECLARE 
    v_test text:= :'test'; 
BEGIN 
    RAISE NOTICE 'test var is %',v_test; 
END$$; 

Я получаю синтаксическую ошибку при попытке оценить значение теста:

ERROR: syntax error at or near ":" 

В идеале я бы например, иметь анонимный блок plpqsql, живущий в файле, который затем будет вызван из сценария оболочки с использованием набора переменных окружения

+0

Этот ответ показывает альтернативное решение дубликата. –

ответ

0

Объяснение: according to the manual:

Переменная интерполяция не будет выполняться в цитированных литералах и идентификаторах SQL.

Корпус оператора DO представляет собой строку в долларах. Таким образом, внутри строки нет интерполяции.

Поскольку это должна быть буквальная строка, вы также можете не конкатенировать строки на лету. The manual:

Это должно быть указано как строковый литерал, так же как в CREATE FUNCTION.

Но вы можете объединить строку, а затем выполнить ее.

\set [ name [ value [ ... ] ] ] 

Задает имя переменной Psql к значению, или , если более чем одно значение дано, чтобы конкатенации всех из них.

Смелый акцент мой. Вы просто должны получить право цитировать:

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:

Смежные вопросы