J'ai une requête assez détaillée dans un script qui utilise ?
espaces réservés. Je voulais tester cette même requête directement à partir de la ligne de commande psql (en dehors du script). Je veux éviter d'entrer et de remplacer tous les ?
avec les valeurs réelles, j'aimerais plutôt passer les arguments après la requête.
Exemple:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
Vous cherchez quelque chose comme:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
Vous pouvez utiliser la construction -v, par exemple
psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'"
et puis se référer aux variables dans SQL comme: v1,: v2 etc
select * from table_1 where id = :v1;
Veuillez faire attention à la façon dont nous passons chaîne/date en utilisant deux guillemets " '...' "
Découvert dans PostgreSQL, vous pouvez instructions PREPARE
comme vous le pouvez dans un langage de script. Malheureusement, vous ne pouvez toujours pas utiliser ?
, mais vous pouvez utiliser $n
notation.
PREPARE foo(text,text,text) AS
SELECT *
FROM foobar
WHERE foo = $1
AND bar = $2
OR baz = $3 ;
EXECUTE foo('foo','bar','baz');
DEALLOCATE foo;
Dans psql, il existe un mécanisme via le
\set name val
commande, qui est supposée être liée à la -v name=val
option de ligne de commande. Citer est pénible. Dans la plupart des cas, il est plus facile de mettre toute la requête dans un document Shell.
oups, j'aurais dû dire -v
au lieu de -P
(pour les options de formatage) la réponse précédente a eu raison.
Vous pouvez également transmettre les paramètres à la ligne de commande psql ou à partir d'un fichier de commandes. Les premières déclarations rassemblent les détails nécessaires à la connexion à votre base de données.
La dernière invite demande les valeurs de contrainte, qui seront utilisées dans la clause WHERE column IN (). Rappelez-vous de guillemets simples si des chaînes et séparez-les par une virgule:
@echo off
echo "Test for Passing Params to PGSQL"
SET server=localhost
SET /P server="Server [%server%]: "
SET database=amedatamodel
SET /P database="Database [%database%]: "
SET port=5432
SET /P port="Port [%port%]: "
SET username=postgres
SET /P username="Username [%username%]: "
SET /P bunos="Enter multiple constraint values for IN clause [%constraints%]: "
ECHO you typed %constraints%
PAUSE
REM pause
"C:\Program Files\PostgreSQL\9.0\bin\psql.exe" -h %server% -U %username% -d %database% -p %port% -e -v v1=%constraints% -f test.sql
Maintenant, dans votre fichier de code SQL, ajoutez le jeton v1 dans votre clause WHERE ou ailleurs dans le code SQL. Notez que les jetons peuvent également être utilisés dans une instruction SQL ouverte, pas seulement dans un fichier. Enregistrez ceci sous test.sql:
SELECT * FROM myTable
WHERE NOT someColumn IN (:v1);
Sous Windows, enregistrez le fichier entier en tant que fichier BATch DOS (.bat), enregistrez le fichier test.sql dans le même répertoire et lancez le fichier de traitement par lots.
Merci à Dave Page, de EnterpriseDB, pour le script d’invite original.
Il semblerait que ce que vous demandez ne peut pas être fait directement à partir de la ligne de commande . Vous devrez soit utiliser une fonction définie par l'utilisateur dans plpgsql, soit appeler la requête à partir d'un langage de script (et cette dernière approche facilite un peu l'évitement de l'injection SQL).