Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour 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 13/12/2007, 00h00   #1
Invité de passage
 
Inscription : décembre 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 8
Points : 1
Points : 1
Par défaut parcourir une nomenclature

salut au fait c une table en nomenclature que je dois parcour de haut vers le bas pour selectionner les noeuds et les feuille d un ensemble principal ensuite je dois la parcourir du bas vers le haut pour calcules les qtes installees a chaque niveau , tout ce code fonctionne bien sauf que le parcour est trop long et des fois le serveur se plante au milieu du traitement y a t il un code plus simple ou une autre solution plus rapide merci pour votre aide
voici le code


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
PROCEDURE           "CALCUL_BESOIN1" (PP_IDENT VARCHAR2)   IS
 BEGIN 
 
DECLARE 
 
	IDENT0   MPIECE.IDENT%TYPE;
	NENS     MPIECE.IDENT%TYPE;
	GLOB_QTE NUMBER;
	GLOB_IDT MPIECE.IDENT%TYPE;
	IDT_QTE  NUMBER;
	IDT_ENS  MPIECE.IDENT%TYPE;
	IDT_LEV  NUMBER;
	IDT_CE   NUMBER;
	IDT_IDT  MPIECE.IDENT%TYPE;   
  TCAL_IDT_QTE NUMBER;
  TCAL_ENS_QTE NUMBER;
  TCAL_IDT MPIECE.IDENT%TYPE;
  X   NUMBER;
-------------- PARCOURIR LA NOMENCLATURE DU HAUT VERS LE BAS POUR EXTRAIRE TOUS LES NUM QUI LA COMPOSE 	
	CURSOR VENTIL_ENS IS
  SELECT DISTINCT IDENT FROM COMPLUS.NOMENCLATURE1; 
 
-------------- PARCOURIR LA NOMECNLATURE DU BAS VERS LE HAUT ET CALCULER LES QTES ---------------------
	CURSOR VENTIL_IDENT IS 	
	SELECT NENS , QTE, IDENT, LEVEL ,CE    FROM COMPLUS.NOMENCLATURE1 WHERE  CE = 4
  CONNECT BY PRIOR NENS = IDENT  AND PRIOR CE = 4 START WITH IDENT = IDENT0;
 
------------- RECHERCHE IDENT ET NENS DANS LA TABLE ACAL ----------------
  CURSOR FIND_IDT IS 
  SELECT IDT1, QTE1 FROM COMPLUS.TCAL WHERE IDT1 = GLOB_IDT;
 
BEGIN
 
---- VIDER LA TABLE DES BESOINS ET LA REINITIALISER AVEC LES ENGINS DE BASE  ----------------
  DELETE FROM BIDON;
  DELETE FROM ABESOIN WHERE NENS = PP_IDENT ;  
-------------------------------------------------------------  	
 
      x:= 0;
      GLOB_QTE := 0; 
      OPEN VENTIL_ENS; 
        LOOP 
        FETCH VENTIL_ENS INTO IDENT0;
      	EXIT WHEN NOT VENTIL_ENS%FOUND ;     		
          OPEN VENTIL_IDENT; 
      	  DELETE FROM COMPLUS.TCAL; 
      	  LOOP 
      	  	FETCH VENTIL_IDENT INTO IDT_ENS, IDT_QTE ,IDT_IDT, IDT_LEV, IDT_CE;
          	EXIT WHEN NOT VENTIL_IDENT%FOUND;
 
             IF GLOB_IDT = PP_IDENT THEN 
             	SELECT QTE1 INTO GLOB_QTE FROM COMPLUS.TCAL WHERE IDT1 = PP_IDENT;
              INSERT INTO COMPLUS.ABESOIN VALUES (IDENT0, PP_IDENT, GLOB_QTE);
              GLOB_QTE := 0;
              DELETE FROM COMPLUS.TCAL WHERE IDT1 NOT IN ( IDT_IDT) ;
             END IF; 
 
              GLOB_IDT := IDT_IDT;
              OPEN FIND_IDT ;
              FETCH FIND_IDT INTO TCAL_IDT, TCAL_IDT_QTE;
              IF FIND_IDT%NOTFOUND THEN 
              	INSERT INTO COMPLUS.TCAL VALUES(GLOB_IDT, 1);
              	TCAL_IDT_QTE := 1;
              END IF;
              CLOSE FIND_IDT;
 
              GLOB_IDT := IDT_ENS;
              OPEN FIND_IDT ;
              FETCH FIND_IDT INTO TCAL_IDT, TCAL_ENS_QTE;
             ---  MESSAGE (GLOB_IDT || '  ' || IDENT0 || '  ' || IDT_QTE);
              IF FIND_IDT%NOTFOUND THEN 
              	INSERT INTO COMPLUS.TCAL VALUES(GLOB_IDT, IDT_QTE * TCAL_IDT_QTE);
              ELSE
              	UPDATE COMPLUS.TCAL SET QTE1 = QTE1 + (IDT_QTE * TCAL_IDT_QTE) WHERE IDT1 = GLOB_IDT;
              END IF;	
              CLOSE FIND_IDT;
      	  END LOOP;
     -- 	  MESSAGE (IDENT0 || '  ' || GLOB_QTE);
          --    SELECT QTE1 INTO GLOB_QTE FROM COMPLUS.TCAL WHERE IDT1 = PP_IDENT;
          --    INSERT INTO COMPLUS.ABESOIN VALUES (IDENT0, PP_IDENT, GLOB_QTE);
          --    GLOB_QTE := 0;
              X := X+1;
              IF   X = 500 THEN 
                   INSERT INTO BIDON VALUES (PP_IDENT , X , X);
                   X:= 0;
                   COMMIT;
             END IF;
            	SELECT QTE1 INTO GLOB_QTE FROM COMPLUS.TCAL WHERE IDT1 = PP_IDENT;
              INSERT INTO COMPLUS.ABESOIN VALUES (IDENT0, PP_IDENT, GLOB_QTE);
              GLOB_QTE := 0; 
              GLOB_IDT := NULL; 
       	  CLOSE VENTIL_IDENT;
        END LOOP;
        CLOSE VENTIL_ENS;
 
    INSERT INTO ABESOIN VALUES (PP_IDENT, PP_IDENT , 1);      
END;
 DELETE FROM NOMENCLATURE1 ; 
 DELETE FROM BIDON;
COMMIT;
END;
formsforms est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 10h40   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
avec connect by prior et les fonctions XML je pense que ça doit être simplifiable
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/12/2007, 19h35   #3
Invité de passage
 
Inscription : décembre 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 8
Points : 1
Points : 1
merci pour votre reponse , pour le connect by prior je l"ai deja utilise , les fonctions xml j'ai pas une grande idee , merci comme meme
formsforms est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2007, 14h38   #4
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 319
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 319
Points : 5 837
Points : 5 837
Il y a beaucoup des commentaires qui expliquent l’algorithme utilisé.
A part ça et les confusions de type Begin suivi de declare et begin etc je pense que :
  • Probablement qu'il n’est pas nécessaire de parcourir la nomenclature 2 fois
  • Probablement que les inserts dans les tables de travail peuvent être évités
  • Le commit par lot pose le souci de l’erreur "snapshot too old".
  • Le bulk collect pouvait aider pour améliorer les performances.
Le conseil est de comprendre bien l’algorithme de le récrire tout simplement en prenant en compte ces remarques.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/12/2007, 08h20   #5
Invité de passage
 
Inscription : décembre 2007
Messages : 8
Détails du profil
Informations forums :
Inscription : décembre 2007
Messages : 8
Points : 1
Points : 1
merci pour tes remarqes
pour les declare et begin .... c parce que je place des fois la logique dans un bouton des fois ds une procedure stockee .... c tout

pour les insert ds les tables ca me permet de faire mes calculs qur les qtes , c la seule methode qui me permet de conserver les resultats temporaire en attendant de trouver une meilleure methode de parcourir la nomenclature

pour les 2 autres remarques je vais voir de plus pret

merci
formsforms 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 02h26.


 
 
 
 
Partenaires

Hébergement Web