Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2780 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Exception PL/SQL

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Exception PL/SQL

n°1773613
GL912
Posté le 15-08-2008 à 15:54:28  profilanswer
 

Salut tout le monde c'est ma tout première fois avec le PL/SQL et j'ai un problème que je n'arrive pas à résoudre j'ai lu différents tutoriels mais l'erreur persiste :
Voici mon code simplifié,c'est une procédure :
 

Code :
  1. create or replace procedure "MISE" (dmj IN DATE,Message OUT  VARCHAR 1,CODE OUT INT)
  2. is
  3. BEGIN
  4. Traitement
  5. EXCEPTION
  6. Traitement EXCEPTION
  7. END;


 
Le problème c'est qu'il ne rentre jamais dans le bloc EXCEPTION et si j'essaye de rajouter un END j'ai une erreur de compilation comment faire ?  

mood
Publicité
Posté le 15-08-2008 à 15:54:28  profilanswer
 

n°1773784
GL912
Posté le 16-08-2008 à 19:56:18  profilanswer
 

Je précise bien sûr qu'il ne rentre pas même s'il y a une erreur.
Cette construction est elle correcte ?
Nom Procédure (paramètres)
is  
Begin
(bloc principal)
EXCEPTION
(bloc de traitement des erreurs)
END;
 
Car je n'ai aucune erreur à la compilation et pourtant le bloc exception n'est pas pris en compte.

n°1773999
casimimir
Posté le 18-08-2008 à 08:05:04  profilanswer
 

et tu es sur que tu catch la bonne exception? tu es passé par un "when others" ?

n°1774034
GL912
Posté le 18-08-2008 à 10:27:01  profilanswer
 

Oui j'ai fait un when others mais il se passe rien comme les autres exceptions.

n°1774089
casimimir
Posté le 18-08-2008 à 13:26:03  profilanswer
 

copie/colle ton bloc d'exception

n°1774092
olivthill
Posté le 18-08-2008 à 13:38:58  profilanswer
 

Il faut mettre "END;" à la fin, c'est obligatoire.
Quelle est l'intitulé de l'erreur de compilation ?
Peut-être que le probleme vient de "VARCHAR 1" sur la première ligne. J'essayerais avec VARCHAR ou VARCHAR2 tout court, sans donner la taille.

n°1774237
GL912
Posté le 18-08-2008 à 18:59:31  profilanswer
 

olivthill a écrit :

Il faut mettre "END;" à la fin, c'est obligatoire.
Quelle est l'intitulé de l'erreur de compilation ?
Peut-être que le probleme vient de "VARCHAR 1" sur la première ligne. J'essayerais avec VARCHAR ou VARCHAR2 tout court, sans donner la taille.


 
Le problème c'est qu'il n y a pas d'erreur de compilation justement.
 

casimimir a écrit :

copie/colle ton bloc d'exception


 
Voilà le code en entier vous allez peut être voir quelque chose que j'ai raté :
 
 

Code :
  1. create or replace procedure "MISE"(dmj IN DATE,Message OUT VARCHAR2,Code OUT INT)
  2. is
  3. test BOOLEAN;
  4. BEGIN
  5. test:=false;
  6. Message:='rien';
  7. Code:=0;
  8. SAVEPOINT s;
  9. UPDATE PROG SET STATUT='1' WHERE DATE_MAJ>DMJ;
  10. if test=true Then ROLLBACK TO SAVEPOINT s;
  11. else Commit;
  12. End if;
  13. EXCEPTION
  14. WHEN  ACCESS_INTO_NULL THEN test:=true; Message:='Table vide veuillez y introduire des enregistrements';
  15. WHEN DUP_VAL_ON_INDEX  THEN test:=true; Message:='Valeur dejà existante veuillez en introduire une nouvelle';
  16. WHEN NO_DATa_FOUND     THEN test:=true; Message:='Table vide';
  17. WHEN PROGRAM_ERROR     THEN test:=true; Message:='Probléme interne';
  18. WHEN STORAGE_ERROR     THEN test:=true; Message:='Mémoire insuffisante';
  19. WHEN TIMEOUT_ON_RESOURCE THEN test:=true; Message:='Erreur programme';
  20. WHEN VALUE_ERROR THEN test:=true; Message:='Erreur conversion';
  21. WHEN OTHERS THEN Message:=SQLERRM;  Code:=SQLCODE;  test:=true;             
  22.        
  23. END;


n°1774343
casimimir
Posté le 19-08-2008 à 09:34:02  profilanswer
 

Le truc a l'air correct, mais tu dis que c'est ta première gestion d'exception, tu t'es pas entrainé sur une fonction bidon pour tester sur un exemple? soit en faisant un raise, soit un truc style to_number('a') qui va d'office lever une exception.
 
ta procédure tu l'appelle avec quoi? il ne faut pas oublier que avec certains langages les index de paramètres peuvent être décalé de 1 (ils commencent a 0 ou 1).
 
autre chose, ton "if test=true Then ROLLBACK TO SAVEPOINT s;" ne s'exécutera jamais, si il passe sur l'instruction test sera toujours false, tu devrais réencapsuler tout ton truc dans un begin/end et faire le test après le bloc d'exception

n°1774348
GL912
Posté le 19-08-2008 à 09:47:04  profilanswer
 

casimimir a écrit :

Le truc a l'air correct, mais tu dis que c'est ta première gestion d'exception, tu t'es pas entrainé sur une fonction bidon pour tester sur un exemple? soit en faisant un raise, soit un truc style to_number('a') qui va d'office lever une exception.
 
ta procédure tu l'appelle avec quoi? il ne faut pas oublier que avec certains langages les index de paramètres peuvent être décalé de 1 (ils commencent a 0 ou 1).
 
autre chose, ton "if test=true Then ROLLBACK TO SAVEPOINT s;" ne s'exécutera jamais, si il passe sur l'instruction test sera toujours false, tu devrais réencapsuler tout ton truc dans un begin/end et faire le test après le bloc d'exception


 
 
Je l'ai testé avec une exception bidon le message restait à 'rien' je crois que c'est la position du commit qui est fausse.
Pour le langage c'est en java.
Je vais modifier le ROLLBACK et COMMIT on verra ce que ça donne.

n°1774378
olivthill
Posté le 19-08-2008 à 10:44:43  profilanswer
 

Tout à fait d'accord avec casimimir. Le test est mal placé puisqu'il n'est exécuté que si l'update se passe bien. Voici ce qu'il faudrait faire :

Code :
  1. create or replace procedure "MISE"(dmj IN DATE,Message OUT VARCHAR2,Code OUT INT)
  2. is
  3.   test BOOLEAN;
  4. BEGIN
  5.   test:=false;
  6.   Message:='rien';
  7.   Code:=0;
  8.   SAVEPOINT s;
  9.   BEGIN
  10.     UPDATE PROG SET STATUT='1' WHERE DATE_MAJ>DMJ;
  11.   EXCEPTION
  12.     WHEN  ACCESS_INTO_NULL THEN test:=true; Message:='Table vide veuillez y introduire des enregistrements';
  13.     WHEN DUP_VAL_ON_INDEX  THEN test:=true; Message:='Valeur dejà existante veuillez en introduire une nouvelle';
  14.     WHEN NO_DATa_FOUND     THEN test:=true; Message:='Table vide';
  15.     WHEN PROGRAM_ERROR     THEN test:=true; Message:='Probléme interne';
  16.     WHEN STORAGE_ERROR     THEN test:=true; Message:='Mémoire insuffisante';
  17.     WHEN TIMEOUT_ON_RESOURCE THEN test:=true; Message:='Erreur programme';
  18.     WHEN VALUE_ERROR THEN test:=true; Message:='Erreur conversion';
  19.     WHEN OTHERS THEN Message:=SQLERRM;  Code:=SQLCODE;  test:=true;           
  20.   END;
  21.   if test=true Then
  22.    ROLLBACK TO SAVEPOINT s;
  23.   else
  24.    Commit;
  25.   End if;
  26. END;

mood
Publicité
Posté le 19-08-2008 à 10:44:43  profilanswer
 

n°1774389
casimimir
Posté le 19-08-2008 à 11:15:31  profilanswer
 

tiens un autre truc, n'appelle pas ta procédure "MISE" mais MISE, parceque la si tu fais appel a l'objet en l'appelant Mise par exemple il ne le trouvera pas

n°1774494
GL912
Posté le 19-08-2008 à 15:49:06  profilanswer
 

Ça marche les mecs merci pour votre aide,si jamais ça peut aider quelqu'un il me semble que c'est la position du COMMIT  qui clochait.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  Exception PL/SQL

 

Sujets relatifs
[SQL] deux count dans une requette[VBA] requete SQL dans un programme VB pour publipostage vers word
[ACCESS] Remplir une table a partir d'une requête SQL en VBSQL vs Fichier
problème de requête - FREETEXTTABLE (SQL serveur)[SQL] "Insert into" et gestion des duplicata?
Problème : Requetes SQL Serveur liés à Access[SQL] Choix d'un bon Query Browser
Comparer deux fichiers DTS SQL Server 2000 
Plus de sujets relatifs à : Exception PL/SQL


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR