No MS SQL Server, crio meus scripts para usar variáveis personalizáveis:
DECLARE @somevariable int
SELECT @somevariable = -1
INSERT INTO foo VALUES ( @somevariable )
Depois, alterarei o valor de @somevariable
em tempo de execução, dependendo do valor que desejo na situação específica. Como está no topo do script, é fácil ver e lembrar.
Como faço o mesmo com o cliente PostgreSQL psql
?
sql
postgresql
variables
psql
Craig Walker
fonte
fonte
Respostas:
As variáveis do Postgres são criadas através do comando \ set, por exemplo ...
... e pode ser substituído, por exemplo, como ...
... ou ...
edit: A partir do psql 9.1, as variáveis podem ser expandidas entre aspas, como em:
Nas versões mais antigas do cliente psql:
... Se você deseja usar a variável como o valor em uma consulta de sequência condicional, como ...
... então você precisa incluir as aspas na própria variável, pois as opções acima não funcionarão. Em vez disso, defina sua variável como tal ...
No entanto, se, como eu, você se deparou com uma situação em que queria criar uma string a partir de uma variável existente, achei o truque a ser esse ...
Agora você tem uma variável entre aspas e não entre aspas da mesma string! E você pode fazer algo assim ....
fonte
\set
é apenas parapsql
ferramenta, você não pode usá-lo em procedimentos armazenados!psql
meta-comandos\set
com os comandos do PostgreSQL de maneira confusa.\set myvariable 'value'
se não incluir qualquer citação dentro da variável, ao contrário do que esta resposta diz. Em caso de dúvida, use\echo :myvariable
dentro do psql para exibir o valor independentemente de qualquer consulta.Uma palavra final sobre as variáveis PSQL:
Eles não se expandem se você os colocar entre aspas simples na instrução SQL. Portanto, isso não funciona:
Para expandir para uma cadeia literal em uma instrução SQL, você deve incluir as aspas no conjunto de variáveis. No entanto, o valor da variável já deve estar entre aspas, o que significa que você precisa de um segundo conjunto de aspas e o conjunto interno precisa ser escapado. Assim você precisa:
EDIT : começando com o PostgreSQL 9.1, você pode escrever:
fonte
:'myvariable'
Você pode tentar usar uma cláusula WITH .
fonte
CREATE TABLE test (name VARCHAR, age INT);
INSERT INTO test (name, age) VALUES ('Jack', 21), ('Jill', 20);
WITH vars AS (SELECT N'Jack' AS name, 21 AS age) SELECT test.* FROM test, vars WHERE test.name = vars.name and test.age = vars.age;
Ouputs Jack e a idade de Jack, como esperado.create table t(x integer);
insert into t(x) with sub as (select 999 as num) select num from sub;
select * from t;
Especificamente para
psql
, você também pode passarpsql
variáveis da linha de comando; você pode passá-los com-v
. Aqui está um exemplo de uso:Observe que os dois pontos não estão entre aspas, então o nome da variável é auto. Sintaxe estranha, eu sei. Isso funciona apenas no psql; não funcionará (digamos) no PgAdmin-III.
Essa substituição ocorre durante o processamento de entrada no psql, portanto você não pode (digamos) definir uma função que use
:'filepath'
e espere que o valor:'filepath'
mude de sessão para sessão. Será substituído uma vez, quando a função estiver definida, e depois será uma constante depois disso. É útil para scripts, mas não para uso em tempo de execução.fonte
FWIW, o verdadeiro problema era que eu incluí um ponto e vírgula no final do meu comando \ set:
O ponto e vírgula foi interpretado como um caractere real na variável:
Então, quando eu tentei usá-lo:
...Eu tenho esse:
Isso não apenas falhou ao definir as aspas ao redor do literal, mas dividiu o comando em duas partes (a segunda inválida ao iniciar com "NOINHERIT").
A moral desta história: "variáveis" do PostgreSQL são realmente macros usadas na expansão do texto, não valores verdadeiros. Tenho certeza de que isso é útil, mas é complicado no começo.
fonte
Você precisa usar uma das linguagens procedurais, como PL / pgSQL, e não a linguagem proc SQL. No PL / pgSQL, você pode usar vars diretamente nas instruções SQL. Para aspas simples, você pode usar a função literal de aspas.
fonte
O postgres (desde a versão 9.0) permite blocos anônimos em qualquer uma das linguagens de script do lado do servidor suportadas
http://www.postgresql.org/docs/current/static/sql-do.html
Como tudo está dentro de uma sequência, as variáveis externas que estão sendo substituídas precisarão ser escapadas e citadas duas vezes. O uso de cotações em dólares não oferece proteção total contra a injeção de SQL.
fonte
Outra abordagem é (ab) usar o mecanismo PostgreSQL GUC para criar variáveis. Veja esta resposta anterior para obter detalhes e exemplos.
Você declara o GUC
postgresql.conf
, depois altera seu valor em tempo de execução comSET
comandos e obtém seu valor comcurrent_setting(...)
.Eu não recomendo isso para uso geral, mas poderia ser útil em casos estreitos como o mencionado na pergunta vinculada, onde o pôster desejava uma maneira de fornecer o nome de usuário no nível do aplicativo para gatilhos e funções.
fonte
Eu o resolvi com uma tabela temporária.
Dessa forma, eu tinha uma "variável" que eu poderia usar em várias consultas, única para a sessão. Eu precisava que ele gerasse "nomes de usuários" exclusivos, embora ainda não tivesse colisões se importasse usuários com o mesmo nome de usuário.
fonte
Eu achei essa pergunta e as respostas extremamente úteis, mas também confusas. Eu tive muitos problemas para que as variáveis citadas funcionassem, então aqui está a maneira como eu consegui que funcionasse:
Dessa forma, você pode definir a variável em uma instrução. Quando você o usa, aspas simples serão incorporadas à variável.
NOTA! Quando coloquei um comentário após a variável citada, ela foi sugada como parte da variável quando tentei alguns dos métodos em outras respostas. Isso realmente estava me ferrando por um tempo. Com esse método, os comentários parecem ser tratados como seria de esperar.
fonte
\set deployment_pass 'string_password'
ALTER USER :deployment_user WITH PASSWORD :'deployment_pass';
Eu realmente sinto falta desse recurso. A única maneira de conseguir algo semelhante é usar funções.
Eu usei de duas maneiras:
Versão Perl:
Versão da tabela:
Notas:
fonte
Variáveis em
psql
chupar. Se você deseja declarar um número inteiro, é necessário inserir o número inteiro, fazer um retorno de carro e encerrar a instrução em ponto e vírgula. Observar:Digamos que eu queira declarar uma variável inteira
my_var
e inseri-la em uma tabelatest
:Tabela de exemplo
test
:Claramente, nada nesta tabela ainda:
Declaramos uma variável. Observe como o ponto e vírgula está na próxima linha!
Agora podemos inserir. Temos que usar esta
:''
sintaxe " " estranha :Funcionou!
Explicação:
Então ... o que acontece se não tivermos o ponto e vírgula na próxima linha? A variável? Dar uma olhada:
Declaramos
my_var
sem a nova linha.Vamos selecionar
my_var
.WTF é isso? Não é um número inteiro , é uma string
999;
!fonte
Publiquei uma nova solução para isso em outro tópico .
Ele usa uma tabela para armazenar variáveis e pode ser atualizado a qualquer momento. Uma função getter imutável estática é criada dinamicamente (por outra função), acionada pela atualização em sua tabela. Você obtém um bom armazenamento de mesa, além das velocidades incrivelmente rápidas de um dispositivo imutável.
fonte