Comment utiliser le script de variables dans psql?
Dans MS SQL Server, j'ai créer mes scripts à utiliser personnalisable variables:
DECLARE @somevariable int
SELECT @somevariable = -1
INSERT INTO foo VALUES ( @somevariable )
Je vais donc modifier la valeur de @somevariable
au moment de l'exécution, en fonction de la valeur que je veux dans la situation particulière. Depuis, il est au sommet du script, il est facile de voir et de se souvenir.
Comment dois-je faire la même chose avec le client PostgreSQL psql
?
- FWIW, l' \opérateur d'ensemble semble être lié à la psql outil de ligne de commande, ne pas pgsql langage de commandes. J'ai peut-être tort.
- Quelle est la version de Postgres êtes-vous?
Vous devez vous connecter pour publier un commentaire.
Postgres variables sont créées par le biais de l' \set de commande, par exemple ...
... et puis peut être substitué, par exemple, que ...
... ou ...
edit: Comme de psql 9.1, les variables peuvent être élargie entre guillemets, comme dans:
Dans les anciennes versions de la psql client:
... Si vous souhaitez utiliser la variable de la valeur d'un conditionnel chaîne de requête, comme ...
... ensuite, vous devez inclure les guillemets dans la variable elle-même comme le ci-dessus ne fonctionnera pas. Au lieu de définir la variable en tant que tel ...
Toutefois, si, comme moi, vous avez couru dans une situation dans laquelle vous avez voulu faire une chaîne à partir d'une variable existante, j'ai trouvé le truc pour être présent ...
Vous avez maintenant une cotées et non cotées de la variable de la même chaîne! Et vous pouvez faire quelque chose comme cela ....
\set
est seulement pourpsql
outil, vous ne pouvez pas l'utiliser dans des procédures stockées!psql
méta-commandes\set
avec les commandes PostgreSQL dans une confusion de la mode.\set myvariable 'value'
n' pas inclure un devis à l'intérieur de la variable, contrairement à ce que cette réponse dit. En cas de doute, utilisez\echo :myvariable
dans psql pour afficher la valeur indépendamment de toute requête.\set quoted_myvariable '\'' :myvariable '\''
vous donne les guillemets dans la variable.\set myvar 'value'
ne fonctionne pas de la façon dont vous décrivez. Vous devez utiliser\set myvar '\'value\''
:'myvar'
comme @Balle + suggère$$
fonctionne aussi -\set quoted_myvariable $$':myvariable'$$
\set args $$'{"text", "text", "text", "text"}'$$::text[]
est la même que\set args ARRAY[$$'text'$$, $$'text'$$, $$'text'$$, $$'text'$$]
Un dernier mot sur PSQL variables:
Ils ne développent pas si vous placez entre guillemets simples dans l'instruction SQL.
Donc cela ne fonctionne pas:
De développer une chaîne de caractères littérale dans une instruction SQL, vous devez inclure les guillemets dans la variable. Toutefois, la valeur de la variable a déjà à être entourées de guillemets, ce qui signifie que vous avez besoin d'un deuxième ensemble de citations, et l'intérieur a échappé. Ainsi, vous avez besoin de:
MODIFIER: à partir de PostgreSQL 9.1, vous pouvez écrire à la place:
:'myvariable'
Vous pouvez essayer d'utiliser un AVEC clause.
WHERE
clause. fair warning.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 et Jack de l'âge, comme prévu.insert into t(x) with sub as (select 999 as num) select num from sub;
select * from t;
Spécifiquement pour
psql
, vous pouvez passerpsql
variables à partir de la ligne de commande trop; vous pouvez les passer avec-v
. Voici un exemple d'utilisation:Noter que le côlon est non cotées, alors la variable nom lui-même est cité. Étrange syntaxe, je sais. Cela ne fonctionne que dans psql; il ne travaille pas (dire) PgAdmin III.
Cette substitution se produit pendant le traitement de l'entrée dans psql, de sorte que vous ne pouvez pas (dire) définir une fonction qui utilise
:'filepath'
et attendre que la valeur de:'filepath'
de changer de session à l'autre. Il va être remplacé une fois, lorsque la fonction est définie, puis sera une constante par la suite. C'est utile pour les scripts, mais pas d'exécution de l'utiliser.FWIW, le vrai problème était que j'avais inclus un point-virgule à la fin de ma \commande set:
Le point-virgule a été interprété comme un caractère réel de la variable:
Donc quand j'ai essayé de l'utiliser:
...J'ai obtenu ceci:
Que non seulement échoué à définir les guillemets autour de la traduction littérale, mais de fractionner la commande en 2 parties (la seconde n'était pas valide comme il a commencé avec "NOINHERIT").
La morale de cette histoire: PostgreSQL "variables" sont en réalité des macros utilisées dans l'expansion du texte, pas les vraies valeurs. Je suis sûr que cela est pratique, mais c'est difficile au premier abord.
Vous devez utiliser l'un des langages procéduraux tels que PL/pgSQL pas le proc SQL langage.
Dans PL/pgSQL vous pouvez utiliser vars droit dans les instructions SQL.
Pour un seul devis, vous pouvez utiliser la citation littérale de la fonction.
postgres (depuis la version 9.0) permet de blocs anonymes dans toutes les versions supportées de script côté serveur langues
http://www.postgresql.org/docs/current/static/sql-do.html
Que tout est à l'intérieur d'une chaîne de caractères externes de la chaîne de variables étant substitué auront besoin d'être échappés et ont cité deux fois. À l'aide dollar citant au lieu de cela ne donnera pas une protection complète contre les injections SQL.
Une autre approche consiste à (ab)utiliser PostgreSQL GUC mécanisme pour créer des variables. Voir cet état de la réponse pour plus de détails et des exemples.
Vous déclarez le GUC dans
postgresql.conf
, puis modifiez sa valeur au moment de l'exécution avecSET
commandes et obtenez sa valeur aveccurrent_setting(...)
.Je ne le recommande pas pour une utilisation générale, mais il pourrait être utile que dans de rares cas comme celui mentionné dans la question, où l'affiche voulait un moyen de fournir le niveau de l'application nom d'utilisateur à des déclencheurs et des fonctions.
Je l'ai résolu avec une table temp.
De cette façon, j'ai eu une "variable", je pourrais l'utiliser sur plusieurs requêtes, ce qui est unique pour la session. J'en avais besoin pour générer unique "noms d'utilisateur" bien que n'ayant pas encore les collisions en cas d'importation des utilisateurs avec le même nom d'utilisateur.
J'ai trouvé cette question et les réponses très utiles, mais aussi à confusion. J'ai eu beaucoup de mal à obtenir les variables citées au travail, voici donc la façon dont je l'ai eu de travail:
De cette façon, vous pouvez définir la variable dans une instruction. Lorsque vous l'utilisez, apostrophes sera intégré dans la variable.
REMARQUE! Quand je mets un commentaire après la cité de la variable il s'est aspiré dans le cadre de la variable lorsque j'ai essayé quelques méthodes dans d'autres réponses. C'était vraiment le vissage de moi pendant un moment. Avec cette méthode, les commentaires semblent être traitée comme vous le souhaitez.
\set deployment_pass 'string_password'
ALTER USER :deployment_user WITH PASSWORD :'deployment_pass';
Je manque vraiment de la fonctionnalité. Seul moyen de parvenir à quelque chose de semblable est d'utiliser des fonctions.
Je l'ai utilisé de deux façons:
Perl version:
Version de Table:
Notes:
Variables dans
psql
sucer. Si vous voulez déclarer un entier, vous devez saisir le nombre entier, puis faire un retour chariot, puis à la fin de l'instruction dans un point-virgule. Observer:Disons que je veux déclarer une variable de type entier
my_var
et de l'insérer dans une tabletest
:Exemple table
test
:Clairement, rien dans ce tableau encore:
Nous déclarons une variable. Remarquez comment le point-virgule est sur la ligne suivante!
Maintenant, nous pouvons insérer. Nous devons utiliser cette étrange "
:''
" à la recherche de la syntaxe:Il a travaillé!
Explication:
Alors... qu'advient-il si nous n'avons pas de point-virgule à la ligne suivante? La variable? Regardez:
Nous déclarons
my_var
sans la nouvelle ligne.Sélectionnez
my_var
.WTF ce que c'est? Ce n'est pas une entier, c'est un chaîne
999;
!J'ai posté une nouvelle solution pour ce sur un autre thread.
Il utilise un tableau pour stocker des variables, et peuvent être mises à jour à tout moment. Statique, immuable fonction get est créé dynamiquement (par une autre fonction), déclenché par la mise à jour de votre table. Vous obtenez une belle table stockage, ainsi que des vitesses ultra rapides de immuable de lecture.