Ich führe ein plpgsql-Skript in Postgres 8.3 aus - Ich möchte Argumente über psql an dieses Skript übergeben. Ich führe das Skript derzeit wie folgt aus:
psql -d database -u user -f update_file.sql
Ich bin auf diesen Link gestoßen, der die Umgebungsvariable PGOPTIONS erklärt, aber für "benutzerdefinierte" Argumente nicht funktioniert. dh ich erhalte eine Fehlermeldung, weil die Einstellung nicht in der Datei postgres.conf aufgeführt ist.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
Irgendwelche anderen Ideen? Idealerweise möchte ich Umgebungsvariablen vermeiden ...
postgresql
psql
Jmoney38
quelle
quelle
-v
Argument von psql.Antworten:
Genau genommen gibt es kein "plpgsql-Skript" - PL / pgSQL ist die Standardprozedursprache von PostgreSQL. Es ist entweder ein SQL-Skript oder eine plpgsql-Funktion / Prozedur. Ihr Beispiel scheint auf ein SQL-Skript hinzuweisen.
Sie können stattdessen eine (serverseitige ) Funktion plpgsql (oder sql) erstellen , die eine beliebige Anzahl von Argumenten akzeptiert . Es ist sehr einfach, solange die Argumente sind
values
. Es wird etwas komplizierter, wenn die Argumente Bezeichner enthalten. Dann müssen Sie PL / pgSQL mit dynamischem SQL und verwendenEXECUTE
.PL / pgSQL ist in PostgreSQL 9.0 oder höher standardmäßig vorinstalliert. Sie müssen es jedoch einmal pro Datenbank in Postgres 8.3 installieren:
Apropos Version: Sie sollten ein Upgrade auf eine aktuelle Version von PostgreSQL in Betracht ziehen . v8.3 ist mittlerweile sehr alt und endet Anfang 2013.
Da Sie anscheinend ein fertiges SQL-Skript haben, werde ich eine SQL-Funktion demonstrieren. Einfache Dummy-Funktion mit zwei ganzzahligen Argumenten:
Viele anspruchsvollere Beispiele für plpgsql finden Sie hier auf dba.SE oder auf SO .
Sie können diese Funktion aufrufen und Parameter in einem Shell-Skript übergeben: Grundlegendes Beispiel für einen Aufruf in einem Shell-Skript, das Eingabeparameter für ganzzahlige Parameter verwendet (keine einfachen Anführungszeichen um den erforderlichen Wert):
Oder mit einem beliebigen Datentyp:
-c
führt eine Befehlszeichenfolge aus und wird dann beendet. Weitere Informationen zu Befehlszeilenargumenten von psql finden Sie im Handbuch .quelle
So fügen Sie eine weitere Funktionalität hinzu für
-v
... Wenn Sie versuchen, das Angebot hinzuzufügen, fügen Sie es in der Befehlszeile hinzu:und dies wird den Code ausführen für:
Das Gleiche wie
quelle
Versuchen Sie
-v
:Wenn Sie
current_setting
undSET
oder verwenden möchtensetval
, müssen Sie eine Zeile anhängenpostgresql.conf
, um die Option hinzuzufügen.quelle
Nach meiner Erfahrung führt das Dereffing einer psql-Variablen in einer plpgsql-Deklaration wie in CREATE FUNCTION BEGIN oder DO BEGIN zu einem Syntaxfehler:
Meine Lösung besteht darin, eine temporäre Tabelle mit einer einzelnen Spalte zu erstellen und den Wert darin zu speichern. Auf diese temporäre Tabelle kann über plpgsql zugegriffen werden, sodass ich psql-Variablen übergeben kann, die in DO-Blöcken verwendet werden.
Um zusätzliche psql-Variablen in CREATE FUNCTION- oder DO-Deklarationen zu verwenden, können Sie eine Spalte pro benötigter Variable erstellen.
quelle
Das ist nicht sehr elegant, aber es funktioniert (Pseudocode):
quelle
Mit diesem Ansatz erhalten Sie eine vollständige Laufzeitauflösung der env-Variablen. Sobald Ihr Skript alle unten aufgeführten Shell-Variablen vorab festgelegt hat, funktioniert es ( wurde tausende Male gegen verschiedene Datenbank- und Hosts ausgeführt ):
quelle