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 10/02/2011, 10h35   #1
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
Par défaut Plusieurs Exception oracle NO_DATA_FOUND dans les procédures

Bonjour a tous,
dans un procédure oracle j'ai plusieurs bloc "select count()" se bloc génère un No_DATA_FOUND si aucun enregistrement est retourné par select :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
 
begin
.....
SELECT count(a) FROM t_a
SELECT count(b) FROM t_b
 
-- ici un traitement qui calcule la valeur d'une variable v_res
 
SELECT count(c) FROM t_c WHERE c = v_res
 
--gestion exception pour les deux premières count
     EXCEPTION
     WHEN NO_DATA_FOUND THEN NULL;
     END;
 
 
end
le problème dans ce procédure est lorsque les deux premières count lève une exception de type NO_DATA_FOUND le programme va dans le bloc exception et il exécute pas le bloc traitement pour calculer v_res

des idées ??
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 10h50   #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
Select Count(*) ne génére jamais l'exception NO_DATA_FOUND
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
Connected TO Oracle DATABASE 10g Enterprise Edition Release 10.2.0.4.0 
Connected AS mni
 
SQL> 
SQL> declare
  2    l_cpt Pls_Integer;
  3  Begin
  4    SELECT count(*)
  5      INTO l_cpt
  6      FROM dual
  7     WHERE 1 = 2;
  8  End;
  9  /
 
PL/SQL procedure successfully completed
 
SQL>
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2011, 11h00   #3
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
si j'ai l'exmple devant moi
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 11h03   #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
Très bien, postez-le.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 11h12   #5
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
attend
j'ai exécuté ton procédure ça passe mais j'arrive pas a comprendre dans mon procédure stocké il y a que des select count et ça passe pas ?

voici la tarace:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
Erreur commençant à la ligne 1 de la commande :
begin
pack_proc_outils.calcul_alertes;
end;
Rapport d'erreur :
ORA-01403: aucune donnée trouvée
ORA-06512: à "SYSTEM.PACK_PROC_OUTILS", ligne 291
ORA-06512: à ligne 2
01403. 00000 -  "no data found"
*Cause:    
*Action:
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 11h25   #6
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
voici ma procedure:

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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
 
 PROCEDURE "CALCUL_ALERTES"
   IS
     CURSOR P_CUR
     IS
       SELECT  DL.NOM_DOMAINE,
		       R.NOM_PRODUCTEUR,
		       R.NOM_FLUX,
		       E.NOM_CONSOMMATEUR,
		       R.NB_FLUX_A_SURVEILLER,
		       R.SEUIL_HORAIRE1,
		       R.SEUIL_HORAIRE2,
		       R.SEUIL_HORAIRE3
       FROM     T_PLANS_DE_ROUTAGES   R,
              T_DL_APPLI_FLUX       DL,
		      T_DYNAMIQUE_ENDPOINTS E,
		      T_POST_TRAITEMENTS    T
       WHERE DL.NOM_APPLICATION = R.NOM_PRODUCTEUR
	   AND DL.NOM_FLUX = R.NOM_FLUX
	   AND E.POST_TRAITEMENT_ID = T.POST_TRAITEMENT_ID
	   AND T.PLAN_DE_ROUTAGE_ID = R.PLAN_DE_ROUTAGE_ID;
 
     R_ALERTES P_CUR%ROWTYPE;
     DATESYSTEM DATE;
     COMPTEUR_ENTREE NUMBER;
     COMPTEUR_SORTIE NUMBER;
     SANTE_FLUX CHAR;
     SANTE_TRANSMISSION CHAR;
     NB_FLUX1 NUMBER;
     NB_FLUX2 NUMBER;
     NB_FLUX3 NUMBER;
     DUREE_SURVEILLANCE NUMBER;
 
   BEGIN
    DBMS_OUTPUT.PUT_LINE(' -------- DEBUT DE PROC STOCK CALCUL_ALERTES -------- ');
    DATESYSTEM:=SYSDATE;
   --DABORD ON VIDE LA TABLE
   EXECUTE IMMEDIATE('TRUNCATE TABLE T_ALERTES');
    OPEN P_CUR;
        LOOP
          BEGIN
            FETCH P_CUR INTO R_ALERTES;
            --SI ON EST A LA FIN EN EXIT
            EXIT WHEN P_CUR%NOTFOUND;
 
 
 
              --CALCULE NOMBRE FLUX SELON SEUIL 1,2 et 3
             SELECT COUNT(TT.NOM_FLUX) INTO NB_FLUX1  FROM T_TRACES TT WHERE TT.NOM_FLUX = R_ALERTES.NOM_FLUX AND TT.CONSOMATEUR = R_ALERTES.NOM_PRODUCTEUR AND TT.DATE_CREATION BETWEEN  DATESYSTEM -  (R_ALERTES.SEUIL_HORAIRE1)/24  AND  DATESYSTEM  GROUP BY NOM_FLUX;
             SELECT COUNT(TT.NOM_FLUX) INTO NB_FLUX2  FROM T_TRACES TT WHERE TT.NOM_FLUX = R_ALERTES.NOM_FLUX AND TT.CONSOMATEUR = R_ALERTES.NOM_PRODUCTEUR AND TT.DATE_CREATION BETWEEN  DATESYSTEM -  (R_ALERTES.SEUIL_HORAIRE2)/24  AND  DATESYSTEM  GROUP BY NOM_FLUX;
             SELECT COUNT(TT.NOM_FLUX) INTO NB_FLUX3  FROM T_TRACES TT WHERE TT.NOM_FLUX = R_ALERTES.NOM_FLUX AND TT.CONSOMATEUR = R_ALERTES.NOM_PRODUCTEUR AND TT.DATE_CREATION BETWEEN  DATESYSTEM -  (R_ALERTES.SEUIL_HORAIRE3)/24  AND  DATESYSTEM  GROUP BY NOM_FLUX;
 
            --GESTION DES EXCEPTIONS
              EXCEPTION
              WHEN NO_DATA_FOUND THEN NULL;
              END;
 
             --CALCULE SANTE_FLUX
             IF R_ALERTES.NB_FLUX_A_SURVEILLER < 0 THEN
             SANTE_FLUX := 'G';
             ELSE
                IF NB_FLUX1 > R_ALERTES.NB_FLUX_A_SURVEILLER THEN
	              SANTE_FLUX := 'V';
	              DUREE_SURVEILLANCE:=R_ALERTES.SEUIL_HORAIRE1;
                  ELSE
	                    IF NB_FLUX3 <= R_ALERTES.NB_FLUX_A_SURVEILLER THEN
	                    SANTE_FLUX := 'R';
	                    DUREE_SURVEILLANCE:=R_ALERTES.SEUIL_HORAIRE3;
                        ELSE
	                         IF NB_FLUX2 <= R_ALERTES.NB_FLUX_A_SURVEILLER THEN
	                         SANTE_FLUX := 'O';
	                         DUREE_SURVEILLANCE:=R_ALERTES.SEUIL_HORAIRE2;
	                         ELSE
		                         SANTE_FLUX := 'J';
		                         DUREE_SURVEILLANCE:=R_ALERTES.SEUIL_HORAIRE1;
		                     END IF;
	                    END IF;
	              END IF;
	         END IF;
 
			--CALCULE COMPTEUR_ENTREE
              SELECT COUNT(T.NOM_FLUX)
		          INTO COMPTEUR_ENTREE
		          FROM T_TRACES T
		         WHERE T.NOM_FLUX = R_ALERTES.NOM_FLUX
		           AND T.PRODUCTEUR = R_ALERTES.NOM_PRODUCTEUR
		           AND T.CONSOMATEUR IS NULL
		           AND T.DATE_CREATION BETWEEN  DATESYSTEM -  (DUREE_SURVEILLANCE)/24  AND  DATESYSTEM
		           GROUP BY T.NOM_FLUX, T.PRODUCTEUR;
 
             --CALCULE COMPTEUR_SORTIE
              SELECT COUNT(T.NOM_FLUX)
		          INTO COMPTEUR_SORTIE
		          FROM T_TRACES T
		         WHERE T.NOM_FLUX = R_ALERTES.NOM_FLUX
		           AND T.PRODUCTEUR = R_ALERTES.NOM_PRODUCTEUR
		           AND T.STATUS = 'OK'
		           AND T.CONSOMATEUR IS NOT NULL
		           AND T.DATE_CREATION BETWEEN  DATESYSTEM -  (DUREE_SURVEILLANCE)/24  AND  DATESYSTEM
		           GROUP BY T.NOM_FLUX, T.PRODUCTEUR;
 
		           RAISE NO_DATA_FOUND;
 
             -- CLACULE SANTE_TRANSMISSION
             IF COMPTEUR_ENTREE = COMPTEUR_SORTIE THEN
             SANTE_TRANSMISSION:='V';
             ELSE
             SANTE_TRANSMISSION:='R';
             END IF;
 
          --INSERT DONNEES
               INSERT INTO T_alertes
				  (nom_domaine,
				   nom_producteur,
				   nom_flux,
				   date_derniere_verif,
				   nom_consomateur,
				   duree_surveillance,
				   compteur_entree,
				   compteur_sortie,
				   sante_flux,
				   sante_transmission)
				VALUES
				  (R_ALERTES.NOM_DOMAINE,
				   R_ALERTES.NOM_PRODUCTEUR,
				   R_ALERTES.NOM_FLUX,
				   DATESYSTEM,
				   R_ALERTES.NOM_CONSOMMATEUR,
				   DUREE_SURVEILLANCE,
				   COMPTEUR_ENTREE,
				   COMPTEUR_SORTIE,
				   SANTE_FLUX,
				   SANTE_TRANSMISSION);
          COMMIT;
        END LOOP;
     CLOSE P_CUR;
    DBMS_OUTPUT.PUT_LINE(' -------- FIN   DE PROC STOCK CALCUL_ALERTES -------- ');
   END "CALCUL_ALERTES";
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 11h31   #7
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
d'après ma petite expérience dans les procédures stocké oracle je suis sur que NO_DATA_FOUND est levé aussi lors d'une select count() ... le scousci est comment géré cette exception
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 11h34   #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
C'est "normal" vous avez une instruction
Code :
1
2
 
               RAISE NO_DATA_FOUND;
apres le select

Code :
1
2
 
             --CALCULE COMPTEUR_SORTIE
[EDIT]
PS. C'est erroné d'utiliser du sql dynamique pour vider la table T_ALERTES
[/EDIT]
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 10/02/2011, 11h57   #9
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
- oui juste une fausse manip de ma part que j'ai oublier :

RAISE NO_DATA_FOUND;

mais toujours le no_data_found persiste

- comment en vas procéder a la suppression de la table ta une autre solution ??
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 10/02/2011, 12h10   #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 Jacobian Voir le message
- oui juste une fausse manip de ma part que j'ai oublier :

RAISE NO_DATA_FOUND;

mais toujours le no_data_found persiste
...
Peut être un autre oubli

Citation:
Envoyé par Jacobian;5770021...
- comment en vas procéder a la suppression de la table ta une autre solution ??
Utilisez une table temporaire.

PS. J’ai dit des conneries, bien sûr qu’il faut un sql dynamique pour le truncate table.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 12h38   #11
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
alors jusqu'à présent j'ai pas de solution je rectifié:

- comment géré les exceptions selon ma première poste ?
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 13h46   #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
Je n'ai pas vu d'exemple qui démontre vous soucis, non plus.
Mettez les select dans des blocks Pl/SQL séparés et gérer les exceptions comme vous avez envie.
Revenez avec un exemple concret ça va aller plus vite.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h27   #13
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
ok , j'ai essayé ça mais la procédure ça compile pas:
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
 
begin
.....
--block 1
    begin
     SELECT count(a) FROM t_a
     SELECT count(b) FROM t_b
  --gestion exception 
     EXCEPTION
     WHEN NO_DATA_FOUND THEN NULL;
     END;
   end; 
-- ici un traitement qui calcule la valeur d'une variable v_res
--block 2
 begin
 SELECT count(c) FROM t_c WHERE c = v_res
 --gestion exception
     EXCEPTION
     WHEN NO_DATA_FOUND THEN NULL;
     END;
 end;
 
 
 
end
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 16h44   #14
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
dsl ça compile merci
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 17h19   #15
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
Vous devez comprendre que mettre la gestion de l'exception NO_DATA_FOUND après un Select Count(*) ne sert à rien.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/02/2011, 18h33   #16
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
hhhhhhh oui il se peut que ça soit vrai théoriquement mais en pratique ça marche pas bon courage
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 04
Vieux 10/02/2011, 18h44   #17
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 Jacobian Voir le message
hhhhhhh oui il se peut que ça soit vrai théoriquement mais en pratique ça marche pas bon courage
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 40
Vieux 11/02/2011, 09h31   #18
Membre Expert
 
Avatar de Garuda
 
Homme Philippe CHIRCOP
Chef de projet
Inscription : juin 2007
Messages : 1 109
Détails du profil
Informations personnelles :
Nom : Homme Philippe CHIRCOP
Localisation : France

Informations professionnelles :
Activité : Chef de projet
Secteur : Bâtiment

Informations forums :
Inscription : juin 2007
Messages : 1 109
Points : 1 559
Points : 1 559
Citation:
Envoyé par Jacobian Voir le message
hhhhhhh oui il se peut que ça soit vrai théoriquement mais en pratique ça marche pas bon courage
Ca, ca va finir dans le bétisier de developpez.com !
__________________
Garuda गरूड
Brahmâ la Guerre et Vishnu la Paix

Oracle 10.2.0.4 - Forms6i patch 17 - Toad 11.1 - sharePoint 2010
Garuda est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/02/2011, 11h10   #19
Membre actif
 
Avatar de Jacobian
 
Inscription : février 2008
Messages : 394
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 394
Points : 161
Points : 161
alors pour ne pas alourdir cette discussion va jeter un coup d'euil ici:

http://forums.oracle.com/forums/thre...sageID=3624185

Noter Bien: Select count() génere une exception de type NO_DATA_FOUND
Jacobian est déconnecté   Envoyer un message privé Réponse avec citation 02
Vieux 11/02/2011, 11h40   #20
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 Jacobian Voir le message
...
Noter Bien: Select count() génere une exception de type NO_DATA_FOUND

En suivant votre lien
Toon Koppelaars dit
Citation:
You shouldn't get a NO_DATA_FOUND in the way you show
SomeoneElse dit
Citation:
This will never throw a NO_DATA_FOUND exception. If no rows match the WHERE clause, the result will be 0.
Centinul dit
Citation:
I don't understand why you are getting a NO_DATA_FOUND exception with the COUNT(*) function because if there are no rows it should still return 0 as the result.
Vous comprenez l'anglais ?
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h42.


 
 
 
 
Partenaires

Hébergement Web