Vous n'êtes pas identifié(e).
Pages : 1
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
Vous voulez lancer des scripts shell par php ?
Hors ligne
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
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
le retour vous voulez dans une interface ou dans le terminal quand vous l'exécutez ?
Hors ligne
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
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
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
merci MitsuTomoe, je vais m'inspirer de ce script ...
postgres'man débutant ..
Hors ligne
Pages : 1