Ich habe eine etwas detaillierte Abfrage in einem Skript, das ?
Platzhalter verwendet. Ich wollte dieselbe Abfrage direkt über die psql-Befehlszeile (außerhalb des Skripts) testen. Ich möchte vermeiden, alle ?
durch tatsächliche Werte zu ersetzen , stattdessen möchte ich die Argumente nach der Abfrage übergeben.
Beispiel:
SELECT *
FROM foobar
WHERE foo = ?
AND bar = ?
OR baz = ? ;
Auf der Suche nach etwas wie:
%> {select * from foobar where foo=? and bar=? or baz=? , 'foo','bar','baz' };
postgresql
parameters
vol7ron
quelle
quelle
Antworten:
Sie können das Konstrukt -v verwenden, z
und beziehen Sie sich dann auf die Variablen in SQL als: v1 ,: v2 usw.
Bitte achten Sie darauf, wie wir den Zeichenfolgen- / Datumswert in zwei Anführungszeichen übergeben
" '...' "
quelle
\set v3 'another value'
. Denken Sie daran, wenn Sie den Wert in der SQL-Anweisung zitieren müssen, verwenden Sie Apostrophe um den Variablennamen, wieSELECT * 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;'
wird ein Syntaxfehler generiert. Wenn Bash jedoch Ihre Shell ist, können Sie versuchen:psql -v v1=12 -v v2="'Hello World'" -v v3="'2010-11-12'" <<< 'select * from table_1 where id = :v1;'
mit gutem Erfolg.In PostgreSQL haben Sie herausgefunden, dass Sie
PREPARE
Anweisungen genau wie in einer Skriptsprache ausführen können. Leider können Sie immer noch nicht verwenden?
, aber Sie können$n
Notation verwenden.Verwenden Sie das obige Beispiel:
quelle
foo
beschäftigt ist und eine anderePREPARE
einen anderen Namen haben sollte, während die aktuelle Sitzung nicht geschlossen ist. Wenn Sie spielen mitPREPARE
inpsql
es ist schwer , jedes Mal einen neuen Namen zu erfinden undDEALLOCATE
damit helfen können =)In psql gibt es einen Mechanismus über die
Befehl, der an die
-v name=val
Befehlszeilenoption gebunden sein soll . Das Zitieren ist schmerzhaft. In den meisten Fällen ist es einfacher, das gesamte Abfragefleisch in ein Shell-Dokument zu legen.Bearbeiten
oops, ich hätte sagen sollen,
-v
anstatt-P
(was für Formatierungsoptionen ist) vorherige Antwort hat es richtig gemacht.quelle
Sie können die Parameter auch über die psql-Befehlszeile oder aus einer Batchdatei übergeben. Die ersten Anweisungen enthalten die erforderlichen Details für die Verbindung mit Ihrer Datenbank.
Die letzte Eingabeaufforderung fragt nach den Einschränkungswerten, die in der WHERE-Spalte IN () verwendet werden. Denken Sie daran, wenn Zeichenfolgen in einfache Anführungszeichen zu setzen und durch Komma zu trennen:
Fügen Sie nun in Ihrer SQL-Codedatei das v1-Token in Ihrer WHERE-Klausel oder an einer anderen Stelle in SQL hinzu. Beachten Sie, dass die Token auch in einer offenen SQL-Anweisung verwendet werden können, nicht nur in einer Datei. Speichern Sie dies als test.sql:
Speichern Sie unter Windows die gesamte Datei als DOS-BATch-Datei (.bat), speichern Sie die Datei test.sql im selben Verzeichnis und starten Sie die Batchdatei.
Vielen Dank für Dave Page von EnterpriseDB für das ursprünglich angeforderte Skript.
quelle
Es scheint, dass das, was Sie fragen, nicht direkt über die Befehlszeile ausgeführt werden kann . Sie müssen entweder eine benutzerdefinierte Funktion in plpgsql verwenden oder die Abfrage aus einer Skriptsprache aufrufen (und der letztere Ansatz erleichtert die Vermeidung von SQL-Injection ein wenig).
quelle