Я запускаю сценарий plpgsql в Postgres 8.3 - я хотел бы передать аргументы этому сценарию через psql. В настоящее время я выполняю скрипт как:
psql -d database -u user -f update_file.sql
Я наткнулся на эту ссылку, которая объясняет переменную среды PGOPTIONS, но она не работает для «пользовательских» аргументов. то есть я получаю сообщение об ошибке, поскольку этот параметр не указан в файле postgres.conf.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
Есть еще идеи? В идеале я бы хотел избежать переменных окружения ...
postgresql
psql
Jmoney38
источник
источник
-v
аргумент PSQL.Ответы:
Строго говоря, «сценария plpgsql» не существует - PL / pgSQL является процедурным языком по умолчанию PostgreSQL. Это либо сценарий SQL, либо функция / процедура plpgsql. Ваш пример, кажется, указывает на сценарий SQL.
Вместо этого вы можете создать (на стороне сервера) функцию plpgsql (или sql) , которая принимает любое количество аргументов. Это очень просто, пока аргументы
values
. Это становится немного сложнее, если аргументы включают идентификаторы. Тогда вам придется использовать PL / pgSQL с динамическим SQL иEXECUTE
.PL / pgSQL предустановлен по умолчанию в PostgreSQL 9.0 или новее. Вы должны установить его один раз для каждой базы данных в Postgres 8.3, хотя:
Говоря о версии: вы должны рассмотреть возможность обновления до текущей версии PostgreSQL. v8.3 к настоящему моменту устарел, его конец жизни пришелся на начало 2013 года.
Поскольку у вас есть готовый сценарий SQL, я продемонстрирую функцию SQL. Простая фиктивная функция с двумя целочисленными аргументами:
Вы можете найти много более сложных примеров для plpgsql здесь, на dba.SE или на SO .
Вы можете вызвать эту функцию и передать параметры в сценарии оболочки: базовый пример вызова в сценарии оболочки, который использует входные параметры для целочисленных параметров (без одинарных кавычек вокруг необходимого значения):
Или с любым типом данных:
-c
выполняет одну командную строку и затем завершается. Подробнее об аргументах командной строки psql в руководстве .источник
Чтобы добавить еще одну функциональность для
-v
... Если вы пытаетесь добавить цитату, добавьте ее в командной строке:и это запустит код для:
Такой же как
источник
Попробуй
-v
:Если вы хотите использовать
current_setting
иSET
илиsetval
, вам нужно добавить строку,postgresql.conf
чтобы добавить опцию.источник
Исходя из моего опыта, разыменование переменной psql внутри объявления plpgsql, такого как CREATE FUNCTION BEGIN или DO BEGIN, приводит к синтаксической ошибке:
Мое решение - создать временную таблицу с одним столбцом и сохранить в ней значение. Эта временная таблица доступна через plpgsql, и поэтому я могу передавать переменные psql, используемые в блоках DO.
Чтобы использовать дополнительные переменные psql в объявлениях CREATE FUNCTION или DO, вы можете создать столбец для каждой необходимой переменной.
источник
Это не очень элегантно, но работает (псевдокод):
источник
Этот подход обеспечит вам полное разрешение env vars во время выполнения ... так что, как только ваш скрипт установит все переменные оболочки ниже, он сработает ( был запущен тысячи раз для разных dbs и хостов ):
источник