Dans MS SQL Server, je crée mes scripts pour utiliser des variables personnalisables:
DECLARE @somevariable int
SELECT @somevariable = -1
INSERT INTO foo VALUES ( @somevariable )
Je changerai alors la valeur de @somevariable
au moment de l'exécution, en fonction de la valeur que je souhaite dans la situation particulière. Comme il se trouve en haut du script, il est facile à voir et à retenir.
Comment faire de même avec le client PostgreSQL psql
?
sql
postgresql
variables
psql
Craig Walker
la source
la source
Réponses:
Les variables Postgres sont créées via la commande \ set, par exemple ...
... et peut ensuite être remplacé, par exemple, par ...
... ou ...
edit: Depuis psql 9.1, les variables peuvent être développées entre guillemets comme dans:
Dans les anciennes versions du client psql:
... Si vous souhaitez utiliser la variable comme valeur dans une requête de chaîne conditionnelle, telle que ...
... alors vous devez inclure les guillemets dans la variable elle-même car ce qui précède ne fonctionnera pas. Définissez plutôt votre variable en tant que telle ...
Cependant, si, comme moi, vous rencontriez une situation dans laquelle vous vouliez créer une chaîne à partir d'une variable existante, j'ai trouvé que l'astuce était la suivante ...
Vous avez maintenant à la fois une variable entre guillemets et sans guillemets de la même chaîne! Et vous pouvez faire quelque chose comme ça ...
la source
\set
est uniquement pour l'psql
outil, vous ne pouvez pas l'utiliser dans les procédures stockées!psql
méta-commandes\set
avec les commandes PostgreSQL d'une manière déroutante.\set myvariable 'value'
ne pas inclure une citation dans la variable, contrairement à ce que dit cette réponse. En cas de doute, utilisez\echo :myvariable
dans psql pour afficher la valeur indépendamment de toute requête.Un dernier mot sur les variables PSQL:
Ils ne se développent pas si vous les mettez entre guillemets simples dans l'instruction SQL. Ainsi cela ne fonctionne pas:
Pour développer une chaîne littérale dans une instruction SQL, vous devez inclure les guillemets dans le jeu de variables. Cependant, la valeur de la variable doit déjà être placée entre guillemets, ce qui signifie que vous avez besoin d'un deuxième ensemble de guillemets et que l'ensemble interne doit être échappé. Il vous faut donc:
EDIT : à partir de PostgreSQL 9.1, vous pouvez écrire à la place:
la source
:'myvariable'
Vous pouvez essayer d'utiliser une clause WITH .
la source
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 l'âge de Jack et Jack, comme prévu.create table t(x integer);
insert into t(x) with sub as (select 999 as num) select num from sub;
select * from t;
Plus précisément pour
psql
, vous pouvez également transmettre despsql
variables à partir de la ligne de commande; vous pouvez les transmettre avec-v
. Voici un exemple d'utilisation:Notez que les deux points ne sont pas entre guillemets, puis le nom de la variable lui-même est cité. Syntaxe étrange, je sais. Cela ne fonctionne que dans psql; cela ne fonctionnera pas dans (disons) PgAdmin-III.
Cette substitution se produit pendant le traitement d'entrée dans psql, vous ne pouvez donc pas (par exemple) définir une fonction qui utilise
:'filepath'
et s'attend à ce que la valeur de:'filepath'
change d'une session à l'autre. Il sera remplacé une fois, lorsque la fonction sera définie, puis sera une constante après cela. C'est utile pour les scripts mais pas pour l'utilisation à l'exécution.la source
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 dans la variable:
Alors quand j'ai essayé de l'utiliser:
... j'ai ceci:
Cela a non seulement échoué à placer les guillemets autour du littéral, mais a également divisé la commande en 2 parties (dont la seconde était invalide car elle commençait par "NOINHERIT").
La morale de cette histoire: les «variables» PostgreSQL sont en réalité des macros utilisées dans l'expansion de texte, pas de vraies valeurs. Je suis sûr que cela est utile, mais c'est délicat au début.
la source
Vous devez utiliser l'un des langages procéduraux tels que PL / pgSQL et non le langage SQL proc. Dans PL / pgSQL, vous pouvez utiliser vars directement dans les instructions SQL. Pour les guillemets simples, vous pouvez utiliser la fonction littérale quote.
la source
postgres (depuis la version 9.0) autorise les blocs anonymes dans l'un des langages de script côté serveur pris en charge
http://www.postgresql.org/docs/current/static/sql-do.html
Comme tout est à l'intérieur d'une chaîne, les variables de chaîne externes remplacées devront être échappées et entre guillemets deux fois. L'utilisation de guillemets en dollars à la place n'offrira pas une protection complète contre l'injection SQL.
la source
Une autre approche consiste à (ab) utiliser le mécanisme PostgreSQL GUC pour créer des variables. Voir cette réponse précédente pour des détails et des exemples.
Vous déclarez le GUC in
postgresql.conf
, puis changez sa valeur au moment de l'exécution avec desSET
commandes et obtenez sa valeur aveccurrent_setting(...)
.Je ne le recommande pas pour une utilisation générale, mais cela pourrait être utile dans des cas restreints comme celui mentionné dans la question liée, où l'affiche voulait un moyen de fournir le nom d'utilisateur au niveau de l'application aux déclencheurs et aux fonctions.
la source
Je l'ai résolu avec une table temporaire.
De cette façon, j'avais une "variable" que je pourrais utiliser sur plusieurs requêtes, qui est unique pour la session. J'en avais besoin pour générer des "noms d'utilisateur" uniques tout en n'ayant toujours pas de collisions lors de l'importation d'utilisateurs avec le même nom d'utilisateur.
la source
J'ai trouvé cette question et les réponses extrêmement utiles, mais aussi déroutantes. J'ai eu beaucoup de mal à faire fonctionner les variables citées, alors voici comment je l'ai fait fonctionner:
De cette façon, vous pouvez définir la variable dans une seule instruction. Lorsque vous l'utilisez, des guillemets simples seront incorporés dans la variable.
REMARQUE! Quand j'ai mis un commentaire après la variable citée, il a été aspiré dans le cadre de la variable lorsque j'ai essayé certaines des méthodes dans d'autres réponses. Cela me dérangeait vraiment pendant un moment. Avec cette méthode, les commentaires semblent être traités comme prévu.
la source
\set deployment_pass 'string_password'
ALTER USER :deployment_user WITH PASSWORD :'deployment_pass';
Cette fonctionnalité me manque vraiment. La seule façon d'obtenir quelque chose de similaire est d'utiliser des fonctions.
Je l'ai utilisé de deux manières:
Version Perl:
Version de table:
Remarques:
la source
Variables dans
psql
sucer. Si vous voulez déclarer un entier, vous devez entrer l'entier, puis faire un retour chariot, puis terminer l'instruction par un point-virgule. Observer:Disons que je veux déclarer une variable entière
my_var
et l'insérer dans une tabletest
:Exemple de tableau
test
:Clairement, rien dans ce tableau pour le moment:
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
:''
syntaxe " ":Ça a marché!
Explication:
Alors ... que se passe-t-il si nous n'avons pas le point-virgule sur la ligne suivante? La variable? Regarde:
Nous déclarons
my_var
sans la nouvelle ligne.Sélectionnons
my_var
.WTF est-ce? Ce n'est pas un entier , c'est une chaîne
999;
!la source
J'ai publié une nouvelle solution pour cela sur un autre fil .
Il utilise une table pour stocker les variables et peut être mis à jour à tout moment. Une fonction getter immuable statique est créée dynamiquement (par une autre fonction), déclenchée par la mise à jour de votre table. Vous obtenez un bon rangement sur la table, ainsi que les vitesses ultra-rapides d'un getter immuable.
la source