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

#1 20/02/2013 12:56:16

tamaloo
Membre

shell Linux et batch postgres

Issu de la filière Oracle sans en être pour autant un cador et parfait débutant PostgreSQL, je souhaiterais pouvoir lancer des chargements de données dans postgres depuis un shell linux, mais également executer des batchs à partir de l'équivalent de procédures stockées (oracle) dans postgresql.  Sous Oracle, j'ai des outils type sqlloader puis j'execute ensuite mes procédures stockées dans mon schéma user et tout cela depuis mon shell linux. Qu'existe-t-il sous postgresql ?

Je me heurte déjà beaucoup aux problèmes d'organisation entre oracle et postgres .. mais je poserai mes questions dans un autre topic ..

Ma présente question est la suivante :

comment mettre en œuvre de tels appels à des fonctions ..  en gros, à quoi ressemblerait un shell linux appelant des fonctions stockées dans postgres ?  Comment tester les codes retour postgres ( erreur sur un "batch" postgres ) ?

Je recherche sur le web mais ne trouve rien de très complet ..

Si vous avez un début de réponse ou même un shell type qui puisse me servir de base de départ, je suis preneur.

Merci


postgres'man débutant ..

Hors ligne

#2 21/02/2013 12:37:05

kenrio
Membre

Re : shell Linux et batch postgres

Vous voulez lancer des scripts shell par php ?

Hors ligne

#3 21/02/2013 12:55:18

tamaloo
Membre

Re : shell Linux et batch postgres

Non, je souhaite lancer des batch en shell linux ... batch qui m'exécute des procédures ( fonctions pour PostgreSQL ) ..

en gros

#/bin/sh
# mon traitement

mois=$1
annee=$2

exec proc1($1,$2)
if $? = 0 on continue ..
else
exit ..

exec proc2($1,$2)
if $? = 0 on continue ..
else
exit

etc etc ..

mais d'une part, je ne sais pas comment lancer les batch postgres , ni comment récupérer le return code pour savoir si la procedure s'est bien passée ..


postgres'man débutant ..

Hors ligne

#4 21/02/2013 12:58:52

tamaloo
Membre

Re : shell Linux et batch postgres

dois-je  lancer les batch par

psql $dbname $dbuser -c 'select mafonction()' 

dans mon shell linux ?

Si oui, comment récupérer mon return code ?


postgres'man débutant ..

Hors ligne

#5 21/02/2013 13:27:02

kenrio
Membre

Re : shell Linux et batch postgres

le retour vous voulez dans une interface ou dans le terminal quand vous l'exécutez ?

Hors ligne

#6 21/02/2013 13:34:37

tamaloo
Membre

Re : shell Linux et batch postgres

je souhaite pouvoir planifier le soir un batch par cron, qu'il s'execute sans sortie autre que comme je le fais maintenant, dans un log ..
les maj concernent ma base de données .. Le traitement peut être déclenché par l'arrivée d'un fichier par CFT par exemple, le batch met à jour mes bases .. qui sont consultables par des pages web ( php .. )


postgres'man débutant ..

Hors ligne

#7 21/02/2013 13:42:51

kenrio
Membre

Re : shell Linux et batch postgres

donc vous faites comme vous avez dis plus haut, faire un script shell avec le psql et la sortie vous la redirigez vers un fichier de log stderr > blabla

Dernière modification par kenrio (21/02/2013 13:43:10)

Hors ligne

#8 21/02/2013 14:35:16

MitsuTomoe
Membre

Re : shell Linux et batch postgres

Un exemple sera certainement plus parlant :

DATE=$(date +%Y-%m-%d)
TIME=$(date +%T)
rm -f /var/lib/postgresql/diff_ann.ok
rm -f /var/lib/postgresql/1131422.xml
rm -f /var/lib/postgresql/1131422.zip

psql << EOF
    select diff_annonces(1,1,1000);
    copy  (select id_envoi from diffusion_envoi where dat_envoi is null order by id_envoi limit 1) to '/var/lib/postgresql/diff_ann.ok';
EOF

id=`head -1 /var/lib/postgresql/diff_ann.ok`
if [ -z "$id" ]
    then 
        echo "Aucun fichier à envoyer"
    else
        echo "Traitement envoi $id" 
         psql << EOF
             copy  (select fichier_contenu from diffusion_envoi where id_envoi = $id) to '/var/lib/postgresql/1131422.xml' csv;
             update diffusion_envoi set dat_envoi='$DATE $TIME' WHERE id_envoi = $id;
EOF
        sed --in-place -e 's/\"\"/\"/g' 1131422.xml
        sed --in-place -e 's/\"<?xml/<?xml/g' 1131422.xml
        sed --in-place -e 's/"$//g' 1131422.xml
        zip -r 1131422.zip 1131422.xml
        ftp -in <<THEEND
            open xxxx
            user xxx xxx
            put 1131422.zip
            close
            bye
THEEND
        msg=" $DATE $TIME          Envoi no. $id effectué"
        echo $msg | mail -s "Multi-diffusion" -t xxx@xx.fr -t  -a From:no-reply@xx.xx
fi

diff_annonces est une fonction pl/PgSQL . Le shell est lancé dans le cron .

Alex

Hors ligne

#9 22/02/2013 05:37:22

tamaloo
Membre

Re : shell Linux et batch postgres

merci MitsuTomoe,  je vais m'inspirer de ce script ...


postgres'man débutant ..

Hors ligne

Pied de page des forums