Eu tenho uma consulta um tanto detalhada em um script que usa ?
espaços reservados. Eu queria testar essa mesma consulta diretamente da linha de comando do psql (fora do script). Quero evitar entrar e substituir todos os ?
por valores reais, em vez disso, gostaria de passar os argumentos após a consulta.
Exemplo:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
Procurando por algo como:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
postgresql
parameters
Vol7ron
fonte
fonte
Respostas:
Você pode usar a construção -v, por exemplo
e, em seguida, referir-se às variáveis em sql como: v1,: v2 etc
Preste atenção em como passamos o valor da string / data usando duas aspas
" '...' "
fonte
\set v3 'another value'
. Apenas lembre-se, quando você precisar citar o valor na instrução SQL, use apóstrofos ao redor do nome da variável, como este:SELECT * FROM foo WHERE bar = :'v3';
awk
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" -c 'select * from table_1 where id = :v1;'
gerará um erro de sintaxe. No entanto, se bash é o seu shell, você pode tentar:psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;'
com bons resultados.Encontrado no PostgreSQL, você pode fazer
PREPARE
declarações exatamente como em uma linguagem de script. Infelizmente, você ainda não pode usar?
, mas pode usar$n
notação.Usando o exemplo acima:
fonte
foo
está ocupado e outroPREPARE
deve ter outro nome enquanto a sessão atual não estiver fechada. Se você jogar comPREPARE
empsql
que é difícil inventar cada vez que um novo nome eDEALLOCATE
pode ajudar com isso =)No psql, há um mecanismo por meio do
comando, que deve estar vinculado à
-v name=val
opção de linha de comando. Citar é doloroso. Na maioria dos casos, é mais fácil colocar toda a carne da consulta dentro de um shell here-document.Editar
opa, eu deveria ter dito em
-v
vez de-P
(que é para opções de formatação) a resposta anterior acertou.fonte
Você também pode passar os parâmetros na linha de comando do psql ou de um arquivo em lote. As primeiras instruções reúnem os detalhes necessários para se conectar ao seu banco de dados.
O prompt final pede os valores de restrição, que serão usados na cláusula IN () da coluna WHERE. Lembre-se de colocar aspas simples nas strings e separar por vírgula:
Agora, em seu arquivo de código SQL, adicione o token v1 dentro de sua cláusula WHERE ou em qualquer outro lugar no SQL. Observe que os tokens também podem ser usados em uma instrução SQL aberta, não apenas em um arquivo. Salve como test.sql:
No Windows, salve o arquivo inteiro como um arquivo DOS BATch (.bat), salve o test.sql no mesmo diretório e execute o arquivo em lote.
Obrigado por Dave Page, de EnterpriseDB, pelo script original solicitado.
fonte
Parece que o que você pergunta não pode ser feito diretamente da linha de comando . Você terá que usar uma função definida pelo usuário em plpgsql ou chamar a consulta de uma linguagem de script (e a última abordagem torna um pouco mais fácil evitar a injeção de SQL).
fonte