Vous n'êtes pas identifié(e).

#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 smile


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) :

  http://blog.rhodiumtoad.org.uk/2009/02/ … -database/


Dimitri Fontaine
http://2ndQuadrant.fr     PostgreSQL : Expertise, Formation et Support

Hors ligne

Pied de page des forums