Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/05/2007, 11h08   #1
Invité de passage
 
Inscription : mai 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 6
Points : 0
Points : 0
Par défaut Récupérer le résultat d'une procédure PL/SQL dnas un fichier.

Bonjour à tous,


Il y a relativement longtemps, mais dans notre galaxie, j'ai fait des choses en SQl et PL/SQL sur des BDD Orcale.

J'ai un peu quitté le milieu, mais aujourd'hui, pour mon taff, j'ai a modifier une procédure pour la patcher. Et vu qu'y a personne dans le coin et que le seul qui sait faire ça est en vacances, le fourbe, c'est Bibi qui s'y colle.


En gros, j'ai une procédure (déjà écrite, à 2/3 modif' près) a qui je veux faire sortir à la fin un fichier de log, pour voir ce qu'il s'est passé.


Le fichier serait du type Result_MaProcédure_JJ_MM_AAAA avec dedans, un truc du style:

- "Tout s'est passé nickel chrome, a demain".
ou
- "Ca a merdouillé grave à cet endroit, et plus précisement <MESSAGE D'ERREUR ORACLE>"


Donc comment puis-je faire pour récupérer le message de réussite (un DBMS.output bête et méchant, j'imagine) ou le message d'erreur et de le mettre dans un fichier Result_MaProcédure_JJ_MM_AAAA, rangé dans un répertoire /Log_MaProcédure/ (sous un syteme Unix) ?

Mes connaissances dans ce domaine sont assez limitées et surtout vachement poussiéreuses.


Merci d'avance et bonne journée
McKenzie.

PS: ce site m'a été conseillé par un ami qui m'en a dit que du bien.
McKenzie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2007, 11h54   #2
Invité de passage
 
Inscription : juillet 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 9
Points : 2
Points : 2
Salut !
C'est marrant j'ai eu exactement la même chose à faire dernièrement, mais j'ai eu la chance de partir de codes source que l'on m'a filés !
Je sais pas comment est ta procédure mais en gros en tout début mon fichier sql je mets :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
WHENEVER OSERROR EXIT FAILURE
WHENEVER SQLERROR EXIT SQL.SQLCODE
SET serveroutput ON
SET echo off
SET pause off
SET linesize 200
SET pagesize 50000
SET newpage none
SET heading off
SET feedback off
SET term off
spool &2 
CONNECT &1
DECLARE
/* mon programme */
où &1 est un paramètre en entrée de connexion usr/mdp
et &2 est le chemin du fichier log
L'option "spool" (d'après ce que j'ai compris) permet d'écrire dans un buffer temporaire puis d'écrire dans le fichier stipulé.
Après dans ton programme tu gères les erreurs avec tes blocs "exception" et des "dbms_output.put" qui sortiront dans ton log (pardon je fait un copier/coller bête et méchant):
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Exception 
      when no_data_found Then -- on est arrivé à la fin du fichier d'entrée
		   dbms_output.put_line('|* When no_data_found principal *|'); 
		   IF tag_erreur then 
		   	rollback;
		   	dbms_output.put_line('|* Code Erreur : ' || sqlcode);
		   	dbms_output.put_line('|* Message Erreur : ' || sqlerrm); 			
	  	   	end IF;
		   commit;
		   dbms_output.put_line('Cpt Lignes APPRO = ' || cpt_ligne || ' / Cpt Lignes GOLD correspondantes = ' || cpt_ligne_out); 
 		   dbms_output.put_line('MSG=fin des messages');
  		   dbms_output.put_line('LOG=fin du script: '||to_char(sysdate,'HH24:MI:SS'));
		   UTL_FILE.FCLOSE( LF$FicIN ) ; -- fermeture du fichier
	  when others Then
	  		rollback;
	  		commit;
	  		UTL_FILE.FCLOSE_ALL ;
	  		dbms_output.put_line('|*                                                                        *|');
	  		dbms_output.put_line('|*                                   ROLLBACK                             *|');
			dbms_output.put_line('|*************************Interruption du programme************************|');
   END ;
Ensuite je sais pas comment tu dois appeler ton programme, mais moi j'ai créé un fichier shell où je lance la commande avec sqlplus :
Code :
sqlplus /NOLOG @${myProgram} ${ChaineConnectionUSR_MDP} ${monFichierLST} >> ${monFichierLOG}
Le fichier lst est pas indispensable je pense.
J'ai défini les variables suivantes :
Code :
1
2
monFichierLST = "mon_chemin_unix/repertoire_logs/myFileLst.lst"
monFichierLOG = "mon_chemin_unix/repertoire_logs/myFileLog.log"
Ensuite pour gérer des noms de fichier log uniques, je définis dans mon shell :
Code :
1
2
# Variable identifiant unique
gsIdUnique=${$}.$(date "+%m%d%H%M%S")
Et je gère mes noms de fichiers comme ceci :
Code :
monFichierLOG=/mon_repertoire/monFichierLog_${gsIdUnique}".log"
J'obtiens alors un nom de fichier du type :
Code :
monFichierLog_0530115206.log
J'espère que ça répond en partie à tes questions !
En tout cas je compatis car on tombe tous sur des galères au boulot
Bon courage !
elyo66 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2007, 16h27   #3
Invité de passage
 
Inscription : mai 2007
Messages : 6
Détails du profil
Informations forums :
Inscription : mai 2007
Messages : 6
Points : 0
Points : 0
Merci, ca a l'air bien comme il me faut !
McKenzie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/05/2007, 09h54   #4
Invité de passage
 
Inscription : juillet 2002
Messages : 9
Détails du profil
Informations forums :
Inscription : juillet 2002
Messages : 9
Points : 2
Points : 2
Ravie d'avoir pu t'aider !
Si ça t'as un souci je peux t'envoyer mes sources qui marchent, c'est plus simple de partir de fichiers existants...
Bonne continuation !
elyo66 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h10.


 
 
 
 
Partenaires

Hébergement Web