Vous n'êtes pas identifié(e).
- Contributions : Récentes | Sans réponse
Pages : 1
#1 01/02/2010 15:45:09
- jydo44
- Membre
example de shell + function pl/sh
Récuperation en shell d'un numéro de sequence
seq="`sudo -u <<user>> psql <<base>> -t -c "select nextval('sequence')" | sed 's/ //g'`"
le sed permet de supprimer les espace.
Un exemple de function pl/sh avec utilisation de nawk pour mise en forme du résultat
Recherche dans un fichier xml ($2) de plusieurs balises pour récuperer l'information contenu dans celle-ci avec les commandes grep, cut, sed
Le sed permet de reformater la date avec des tirets
Je passe la variable de la séquence à nawk avec le -v id_client=$3
appel de la function
sudo -u <<user>> psql <<base>> -c "select sh_client('<<repertoire>>','<<fichier>>',$seq);"
CREATE OR REPLACE FUNCTION sh_client(repertoire text, fichier text, seq integer)
RETURNS integer AS
$BODY$#!/bin/sh
cd $1
grep -E "<Nom>|<TypeMessage>|<DomaineDeFlux>|<Date>" $2 | cut -d">" -f2 | cut -d"<" -f1 | sed "s/[/]/-/g" |
nawk -v id_client=$3 '{cp=split($0,st,"-")} \
{if (cp!=1) ligne=ligne" "st[3]"-"st[2]"-"st[1]","; \
else
ligne=ligne"\047"$0"\047,";
}END{gsub(" ","",id_client);
ligne=id_client" "ligne;
ligne="Insert into clients values ("substr(ligne,1,length(ligne)-1)");";
print ligne > "'client.sql'"}'
exit 0$BODY$
LANGUAGE 'plsh' VOLATILE
COST 100;
ALTER FUNCTION sh_client(text, text,integer) OWNER TO postgres;
Enfin j'injecte dans ma base le fichier résultant.
sudo -u <<user>> psql <<base>> -q -f "client.sql"
J'aurai pu aussi le faire dans la fonction mais j'ai contaté qu'avec plusieurs lignes, les performances sont diminuées.
Hors ligne
#2 02/02/2010 14:57:09
- ioguix
- Administrateur
Re : example de shell + function pl/sh
Salut,
Pour info, vous pouvez vous séparer du "sed 's/ //g'" en utilisant les options -t et -A de psql et ainsi formater sa sortie à votre besoin, sans espaces...
Hors ligne
#3 05/02/2010 12:22:41
- jydo44
- Membre
Re : example de shell + function pl/sh
Merci de l'info.
J'utilise le -t de la commande psql mais pour les premières unités, j'ai constaté qu'il y avait toujours des espaces.
Je suis sur Ubuntu 9.1
Hors ligne
#4 05/02/2010 18:03:37
- Marc Cousin
- Membre
Re : example de shell + function pl/sh
Attention quand même aux performances de ce genre de code : pour chaque appel à cette fonction, on démarre 5 processus… (1 sh, 1 grep, 2 cut, un sed, un awk).
Ce n'est donc pas vraiment le genre de code que je mettrais dans une fonction trigger
Marc.
Hors ligne
#5 06/02/2010 14:52:59
- jydo44
- Membre
Re : example de shell + function pl/sh
Bonjour Marc,
Effectivement, cela reste juste un exemple de récupération d'un certains nombres de champs dans un fichier.
Je compare certaines fonctions réalisées en sh + plsql avec plsh.
Je suis concient des processus mise en oeuvre avec de telles commandes.
Merci de cette information
Hors ligne
#6 06/02/2010 15:18:03
- Marc Cousin
- Membre
Re : example de shell + function pl/sh
Ce n'était pas pour critiquer, mais pour mettre en garde (j'ai déjà vu des abus dans des scripts shell).
C'est d'ailleurs une des raisons pour choisir un langage plus avancé (perl, python et compagnie) même en script dès que les traitements se compliquent.
Il est assez fréquent de voir un script bouclant des milliers de fois sur 2 seds et un awk avec un pipe… sur le serveur, ça se traduit par une charge 100% système pendant un bout de temps, et l'admin qui met du temps à trouver le coupable…
Marc.
Hors ligne
#7 16/09/2011 18:03:36
- dim
- Membre
Re : example de shell + function pl/sh
Si je comprends bien le problème, il s'agit de charger certaines données depuis un fichier XML. J'aurais utilisé la technique suivante puis un traitement avec les fonctions XML de PostgreSQL, ou bien du plpythonu (ou plperlu si cela vous convient mieux) :
Dimitri Fontaine
http://2ndQuadrant.fr PostgreSQL : Expertise, Formation et Support
Hors ligne
Pages : 1