J'exécute un script plpgsql dans Postgres 8.3 - Je voudrais passer des arguments à ce script via psql. J'exécute actuellement le script comme:
psql -d database -u user -f update_file.sql
Je suis tombé sur ce lien qui explique la variable d'environnement PGOPTIONS, mais qui ne fonctionne pas pour les arguments "personnalisés". c'est-à-dire que je reçois une erreur car le paramètre n'est pas répertorié dans le fichier postgres.conf.
-bash-3.2$ export PGOPTIONS='--pretend=true'
-bash-3.2$ psql -d my_db -f update_database.sql
psql: FATAL: unrecognized configuration parameter "pretend"
D'autres idées? Idéalement, j'aimerais éviter les variables d'environnement ...
postgresql
psql
Jmoney38
la source
la source
-v
argument de psql.Réponses:
À strictement parler, il n'existe pas de "script plpgsql" - PL / pgSQL est le langage procédural par défaut de PostgreSQL. Il s'agit soit d'un script SQL, soit d'une fonction / procédure plpgsql. Votre exemple semble indiquer un script SQL.
Vous pouvez créer une fonction plpgsql (ou sql) ( côté serveur ) à la place, qui accepte un nombre illimité d'arguments. C'est très simple tant que les arguments le sont
values
. Cela devient un peu plus compliqué si les arguments incluent des identifiants. Ensuite, vous devrez utiliser PL / pgSQL avec SQL dynamique etEXECUTE
.PL / pgSQL est préinstallé par défaut dans PostgreSQL 9.0 ou version ultérieure. Vous devez l'installer une fois par base de données dans Postgres 8.3, cependant:
En parlant de la version: vous devriez envisager de passer à une version actuelle de PostgreSQL. La v8.3 est désormais très ancienne, en fin de vie début 2013.
Puisque vous semblez avoir un script SQL prêt, je vais vous montrer une fonction SQL. Fonction factice simple avec deux arguments entiers:
Vous pouvez trouver de nombreux exemples plus sophistiqués pour plpgsql ici sur dba.SE ou sur SO .
Vous pouvez appeler cette fonction et remettre des paramètres dans un script shell: Exemple de base pour un appel dans un script shell qui utilise des paramètres d'entrée pour les paramètres entiers (pas de guillemets simples autour de la valeur requise):
Ou avec n'importe quel type de données:
-c
exécute une chaîne de commande, puis se ferme. Plus d'informations sur les arguments en ligne de commande de psql dans le manuel .la source
Pour ajouter une autre fonctionnalité pour
-v
... Si vous essayez d'ajouter la citation, ajoutez-la dans la ligne de commande:et cela exécutera le code pour:
Le même que
la source
Essayez
-v
:Si vous souhaitez utiliser
current_setting
etSET
ousetval
, vous devez ajouter une ligne àpostgresql.conf
pour ajouter l'option.la source
D'après mon expérience, la suppression d'une variable psql dans une déclaration plpgsql comme dans CREATE FUNCTION BEGIN ou DO BEGIN entraîne une erreur de syntaxe:
Ma solution consiste à créer une table temporaire avec une seule colonne et à y stocker la valeur. Cette table temporaire est accessible via plpgsql et je peux donc passer des variables psql utilisées avec dans des blocs DO.
Pour utiliser des variables psql supplémentaires dans les déclarations CREATE FUNCTION ou DO, vous pouvez créer une colonne par variable requise.
la source
Ce n'est pas très élégant mais ça marche (pseudocode):
la source
Cette approche vous fournira une résolution d'exécution complète des vars env ... donc dès que votre script définit à l'avance toutes les variables de shell ci-dessous, cela fonctionnera ( a été exécuté des milliers de fois contre différents dbs et hôtes ):
la source