Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
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 07/03/2011, 14h47   #1
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Par défaut Gestion des erreurs Sybase > Oracle

Bonjour à tous,

j'ai actuellement une base sous Sybase composée de procédures stockées.
Je souhaite migrer ma base Sybase vers Oracle néanmoins je souhaitais savoir comment les erreurs vont être traitées ?

Je vous met ci dessous une de mes nombreuses procédures stockées.


Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
CREATE procedure proc_validate_ident   
AS    
 
declare @ERREUR int   
 
 
DELETE IDENTIFICATION FROM TEMPIDENT , IDENTIFICATION   
WHERE TEMPIDENT.TEMPIDENT_IDENT = IDENTIFICATION.IDENT_IDENT   
 
SELECT @ERREUR = @@ERROR   
 
IF (@ERREUR = 0)   
begin   
  INSERT IDENTIFICATION (IDENT_IDENT,IDENT_GENRE,IDENT_NOM,IDENT_ADR1,IDENT_ADR2,   
  IDENT_ADR3,IDENT_ADR4,IDENT_CIGAP,IDENT_NUMSS,IDENT_DATEMOUV)   
  SELECT TEMPIDENT_IDENT,TEMPIDENT_GENRE,TEMPIDENT_NOM,TEMPIDENT_ADR1,TEMPIDENT_ADR2,   
  TEMPIDENT_ADR3,TEMPIDENT_ADR4,TEMPIDENT_CIGAP,TEMPIDENT_NUMSS,TEMPIDENT_DATEMOUV   
  FROM TEMPIDENT   
 
end   
else   
begin   
    print "Probleme avec la table IDENTIFICATION "   
    RETURN   
end


Par exemple, je n'ai aucune idée dont va être traité ma ligne :

" select @ERREUR = @@ERROR " sous entendu le @@ERROR retourne un code erreur, ce qui m'intéresse ici, c'est le cas ou il n'y a pas d'erreur, le cas ou il retourne 0 en clair.

Je souhaiterais avoir de l'aide ou de la doc pour avancer dans mon projet de migration..

Merci à tous,

NarbOni
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h07   #2
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Oracle != Sysbase.
Vous devez réécrire vos procédures en PL/SQL. Il y a un tutoriel PL/SQL sur ce site.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h23   #3
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Oui jusque là j'avais compris, il va falloir réécrire pour passer de Transact-SQL à Pl/Sql, néanmoins, ça ne m'explique pas de tout comment gérer les erreurs en Pl/Sql ... ? Comparé au retour erreur en Transact-SQL.
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 15h41   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Bah c’est plus compliqué que ça en réalité.
Pour moi votre procédure devient
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
 
CREATE procedure proc_validate_ident   
AS       
Begin
  DELETE IDENTIFICATION
  WHERE EXISTS (SELECT NULL
                  FROM TEMPIDENT
                 WHERE  TEMPIDENT.TEMPIDENT_IDENT = IDENTIFICATION.IDENT_IDENT
  --  
  INSERT IDENTIFICATION (IDENT_IDENT,IDENT_GENRE,IDENT_NOM,IDENT_ADR1,IDENT_ADR2,   
                         IDENT_ADR3,IDENT_ADR4,IDENT_CIGAP,IDENT_NUMSS,IDENT_DATEMOUV)   
  SELECT TEMPIDENT_IDENT,TEMPIDENT_GENRE,TEMPIDENT_NOM,TEMPIDENT_ADR1,TEMPIDENT_ADR2,   
         TEMPIDENT_ADR3,TEMPIDENT_ADR4,TEMPIDENT_CIGAP,TEMPIDENT_NUMSS,TEMPIDENT_DATEMOUV   
  FROM TEMPIDENT ;
End;       
/
Et comme vous pouvez le constaté je ne ressens le moindre besoin d’ajouter un gestionnaire des exceptions en cas d’anomalie.
Mais est-ce que j'ai bien compris votre code Transact SQL (c'es un langage que je ne maîtrise pas) ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 16h11   #5
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
En fait, nous faisons une suppression et dans le SELECT on y indique un code erreur ( Nous avons 0 si la suppression de la table s'est déroulée correctement et un autre chiffre peut importe le nombre vu que ce n'est pas correct ).

Si la suppression s'est correctement déroulée on procède à la création et insertion, sinon, nous avons un message nous annonçant que nous avons eu un problème lors de la suppression.

Ce que je souhaitais savoir c'est si nous avions la possibilité de gérer ce 'code retour' afin de savoir si la suppression s'exécute comme il faut, et si ce n'est pas le cas, m'avertir du problème ?

Encore merci,
NarbOni.
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/03/2011, 19h28   #6
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
C'est une autre philosophie avec Oracle. Vous supprimez les donnés via delete. Si une erreur se produit alors une exception sera levée et l'insertion ne va pas poursuivre. Sinon la procédure continue avec l'insertion. C'est le code que j'ai vous aie proposé.

Maintenant, le code de retour ne sert à rien. Si une exception est levée, par le delete ou par l'insert, comme elle n'est pas intercepté par la procédure elle est envoyé automatiquement au code appelant. C'est peut être à ce code appelant d'intercepter l'exception et de la traiter.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 09h58   #7
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Et comment récupérer et "traiter" ce code appelant ?

Parce que moi c'est pareil, mais la gestion de l'erreur me permet juste de savoir si j'ai un soucis quelconque sur ma procédure. Car la soit la procédure se déroule correctement et tout se passe bien, soit pas, mais je n'ai aucune garanti du bon déroulement de la procédure si il y a un problème si ?

En fait, je veux être sure que tout s'est bien passé. Et sans la gestion de cette erreur j'arrive pas à savoir comment être certain que tout est passé sans aucune erreur ( car en fait j'ai ~400 procédures stockées à migrer donc je peux pas les vérifier une par une )

NarbOni
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 14h02   #8
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Lisez La section de gestion des erreurs
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h08   #9
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Haha, comme vous m'aviez parlé du tuto j'en étais aux curseurs explicites !

Merci en tout cas,
NarbO
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/03/2011, 15h57   #10
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Citation:
Envoyé par NarbOni Voir le message
Et comment récupérer et "traiter" ce code appelant ?

Parce que moi c'est pareil, mais la gestion de l'erreur me permet juste de savoir si j'ai un soucis quelconque sur ma procédure. Car la soit la procédure se déroule correctement et tout se passe bien, soit pas, mais je n'ai aucune garanti du bon déroulement de la procédure si il y a un problème si ?

...
S’il y a un problème alors y aura une exception. Le code appelant peut décider soit de la traiter soit de la laisser filler envers l'appelant.
Analysez aussi l'exemple qui suit:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS impdata
 
SQL> 
SQL> SET serveroutput ON
SQL> CREATE OR REPLACE Procedure Foo(p_in number) IS
  2    l_var          Pls_Integer;
  3  Begin
  4    SELECT 1/p_in
  5      INTO l_var
  6      FROM Dual;
  7  End;
  8  /
 
Procedure created
SQL> Begin
  2    foo(1);
  3    Dbms_output.put_line('OK');
  4  End;
  5  /
 
OK
 
PL/SQL procedure successfully completed
SQL> Begin
  2    foo(0);
  3    Dbms_output.put_line('OK');
  4  End;
  5  /
 
Begin
  foo(0);
  Dbms_output.put_line('OK');
End;
 
ORA-01476: le diviseur est égal à zéro
ORA-06512: à "IMPDATA.FOO", ligne 4
ORA-06512: à ligne 3
SQL> Begin
  2    foo(0);
  3    Dbms_output.put_line('OK');
  4  Exception
  5  When ZERO_DIVIDE THEN
  6    Dbms_output.put_line('KO');
  7  End;
  8  /
 
KO
 
PL/SQL procedure successfully completed
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 10h28   #11
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Bonjour,

Si je comprend bien les 3 lignes d'ORA-xxxxxx sont les erreurs remontées lors des exécutions de script sans spécifier les erreurs.

Néanmoins, nous ne gérons pas les erreurs directement, surtout que nous avons énormément de code d'erreur.

Je pense que je vais réussir à m'en sortir grâce à votre aide.

Juste une dernière question de curiosité, pendant m'a recherche j'ai vu à plusieurs reprises que @@ERROR était remplacé sous Oracle par SQLCODE.

Avez-vous plus de détail à ce sujet ? De ce que j'ai compris ça renvoi le numéro de l'erreur associé à Oracle (j'en conclu le -xxxxx) est-ce exact ? Si c'est le cas, est-ce qu'un ORA-00000 signifie qu'il n'y à aucune erreur, ou est-ce un autre numéro ?

Merci,
NarbOni
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h06   #12
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
SQLCODE
Ora-00000

Mais si vous traduisez votre code tel-quel vous avez raté quelque chose.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 11h26   #13
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
C'est à dire ? Je ne suis pas là
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/03/2011, 14h25   #14
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Dans l'exemple ci dessous:
Code :
1
2
3
4
5
6
7
 
Begin
  ...
  DELETE FROM TABLE WHERE ...
 
  IF sqlcode = 0 Then
...
le "If" ne s'éxecute que si sqlcode vaut 0 donc le test est inutile.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 16h30   #15
Invité régulier
 
Inscription : février 2011
Messages : 41
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 41
Points : 8
Points : 8
Donc, si le code n'est pas égal à 0 le code qui suit ne seras pas pris en compte ?


Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
IF EXISTS (SELECT 1 FROM  sysobjects o, sysusers u 
                  WHERE o.uid=u.uid AND o.name = 'PAIE' AND u.name = 'dbo' AND o.type = 'U'  ) 
    DROP TABLE PAIE
		IF (@@error != 0)
			BEGIN
				PRINT "Error CREATING table 'PAIE'"
				SELECT syb_quit()
			END
go
 
CREATE TABLE PAIE  (
 	PAIE_IDENT       	char(6)   	    	NOT NULL
  ,PAIE_AAAAMM     	char(6)   	    	NOT NULL
	,REFRAPPEL_CODE 	char(1)          	NULL
	,REFELT_CODE    	char(4)       	  NULL	
	,PAIE_MONTANT		  numeric(9,2)		  NULL
	,PAIE_ORIGINE   	char(1)         	NULL
	,PAIE_TYPE      	char(2)         	NULL
)
go

Donc comment vous feriez pour la création d'un table sous Oracle pour gérer cette erreur ?
NarbOni est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/03/2011, 17h13   #16
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
Détails du profil
Informations personnelles :
Nom : Homme Marius Nitu
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : octobre 2007
Messages : 3 311
Points : 5 808
Points : 5 808
Avec Oracle je ne créerais jamais des tables dans mes procédures. Tous les objets doivent exister, créées via des scripts sql.
mnitu 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 16h02.


 
 
 
 
Partenaires

Hébergement Web