Exception PL/SQL

Exception PL/SQL - SQL/NoSQL - Programmation

Marsh Posté le 15-08-2008 à 15:54:28    

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 ?  

Reply

Marsh Posté le 15-08-2008 à 15:54:28   

Reply

Marsh Posté le 16-08-2008 à 19:56:18    

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.

Reply

Marsh Posté le 18-08-2008 à 08:05:04    

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

Reply

Marsh Posté le 18-08-2008 à 10:27:01    

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

Reply

Marsh Posté le 18-08-2008 à 13:26:03    

copie/colle ton bloc d'exception

Reply

Marsh Posté le 18-08-2008 à 13:38:58    

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.

Reply

Marsh Posté le 18-08-2008 à 18:59:31    

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;


Reply

Marsh Posté le 19-08-2008 à 09:34:02    

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

Reply

Marsh Posté le 19-08-2008 à 09:47:04    

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.

Reply

Marsh Posté le 19-08-2008 à 10:44:43    

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;

Reply

Marsh Posté le 19-08-2008 à 10:44:43   

Reply

Marsh Posté le 19-08-2008 à 11:15:31    

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

Reply

Marsh Posté le 19-08-2008 à 15:49:06    

Ç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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed