Estou executando um script plpgsql no Postgres 8.3 - gostaria de passar argumentos para este 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, eu gostaria de evitar variáveis de ambiente ...
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
Experimente
-v
:Se você quiser usar
current_setting
eSET
ousetval
, precisará anexar uma linha apostgresql.conf
para adicionar a opção.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 recebe qualquer número de argumentos. É muito simples, desde que os argumentos sejam
values
. Fica um pouco mais complicado se os argumentos incluírem 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 atualizar para uma versão atual do PostgreSQL. v8.3 é muito antigo agora, 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 para 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 string de comando e sai. Mais sobre argumentos de linha de comando do psql no manual .Pela minha experiência, dereffing 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 assim posso passar variáveis do psql usadas em blocos DO.
Para usar variáveis adicionais do psql em declarações CREATE FUNCTION ou DO, você pode criar uma coluna por variável necessária.
Isso não é muito elegante, mas funciona (pseudocódigo):
Essa abordagem fornecerá a resolução completa em tempo de execução do env vars ... portanto, assim que seu script definir antecipadamente todas as variáveis do shell abaixo, ele funcionará ( foi executado milhares de vezes em diferentes dbs e hosts ):