IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

parcourir une nomenclature


Sujet :

SQL Oracle

  1. #1
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    avec connect by prior et les fonctions XML je pense que ça doit être simplifiable

  3. #3
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    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

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    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 : 5 611
    Par défaut
    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.

  5. #5
    Membre habitué
    Inscrit en
    Décembre 2007
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 8
    Par défaut
    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

Discussions similaires

  1. [AC-2010] Requête récursive pour parcourir une nomenclature
    Par Philippe PONS dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 05/07/2014, 09h48
  2. Requête récursive pour parcourir une nomenclature (Suite)
    Par Philippe PONS dans le forum Développement
    Réponses: 4
    Dernier message: 03/07/2014, 14h09
  3. [2012] Requête récursive pour parcourir une nomenclature
    Par Philippe PONS dans le forum Développement
    Réponses: 3
    Dernier message: 03/07/2014, 09h36
  4. Réponses: 5
    Dernier message: 21/07/2004, 19h34
  5. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo