Estou executando um script plpgsql no Postgres 8.3 - gostaria de passar argumentos para esse script via psql. Atualmente, estou executando o script como:
psql -d database -u user -f update_file.sql
Me deparei com este link que explica a variável de ambiente PGOPTIONS, mas isso não funciona para argumentos "personalizados". ou seja, recebo um erro porque a configuração não está listada no arquivo 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"
Alguma outra ideia? Idealmente, gostaria de evitar variáveis de ambiente ...
postgresql
psql
Jmoney38
fonte
fonte
-v
argumento do psql.Respostas:
Estritamente falando, não existe um "script plpgsql" - PL / pgSQL é a linguagem procedural padrão do PostgreSQL. É um script SQL ou uma função / procedimento plpgsql. Seu exemplo parece indicar um script SQL.
Você pode criar uma função plpgsql (ou sql) (do lado do servidor ) , que aceita qualquer número de argumentos. É muito simples, desde que os argumentos sejam
values
. Fica um pouco mais complicado se os argumentos incluem identificadores. Então você terá que usar PL / pgSQL com SQL dinâmico eEXECUTE
.O PL / pgSQL é pré-instalado por padrão no PostgreSQL 9.0 ou posterior. Você precisa instalá-lo uma vez por banco de dados no Postgres 8.3, no entanto:
Falando da versão: você deve considerar a atualização para uma versão atual do PostgreSQL. A v8.3 já é muito antiga e está em fim de vida no início de 2013.
Como você parece ter um script SQL pronto, demonstrarei uma função SQL. Função fictícia simples com dois argumentos inteiros:
Você pode encontrar muitos exemplos mais sofisticados de plpgsql aqui no dba.SE ou no SO .
Você pode chamar esta função e entregar parâmetros em um script de shell: Exemplo básico para uma chamada em um script de shell que usa parâmetros de entrada para parâmetros inteiros (sem aspas simples em torno do valor necessário):
Ou com qualquer tipo de dados:
-c
executa uma sequência de comandos e sai. Mais sobre argumentos de linha de comando do psql no manual .fonte
Para adicionar outra funcionalidade para
-v
... Se você estiver tentando adicionar a cotação, adicione-a na linha de comando:e isso executará o código para:
O mesmo que
fonte
Tente
-v
:Se você deseja usar
current_setting
eSET
ousetval
, é necessário anexar uma linhapostgresql.conf
para adicionar a opção.fonte
Da minha experiência, desreffing uma variável psql dentro de uma declaração plpgsql, como em CREATE FUNCTION BEGIN ou DO BEGIN, resulta em um erro de sintaxe:
Minha solução é criar uma tabela temporária com uma única coluna e armazenar o valor nela. Esta tabela temporária é acessível via plpgsql e, portanto, posso passar variáveis psql usadas nos blocos DO.
Para usar variáveis psql adicionais nas declarações CREATE FUNCTION ou DO, você pode criar uma coluna por variável necessária.
fonte
Isso não é muito elegante, mas funciona (pseudocódigo):
fonte
Essa abordagem fornecerá a resolução total em tempo de execução dos env vars ... assim que seu script definir antecipadamente todas as variáveis de shell abaixo, ele funcionará ( foi executado milhares de vezes em diferentes dbs e hosts ):
fonte