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 :

Procedure qui compile, probleme execution


Sujet :

SQL Oracle

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut Procedure qui compile, probleme execution
    Salut tout le monde....

    J'ai créer une procédure pl/sql. Celle-ci est compilée sans aucune erreurs !!!
    Par contre lorsque je lance l'exécution de celle-ci, une erreur au niveau de mon premier curseur apparait... Quelqu'un a déjà rencontré ce problème et aurait une idée d'où cela peut venir???


    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
    CREATE OR REPLACE PROCEDURE frequency_product (nbYear NUMBER) IS
    	CURSOR C_Staging IS
    		SELECT  HostPartID, COUNT (HostPartID) AS I
    		FROM Staging
    		WHERE MONTHS_BETWEEN(sysdate, SalesOrderMatAvailDt) <= nbYear*12
    		GROUP BY HostPartID
    		ORDER BY I DESC;
    	demToT NUMBER;
    	threshold NUMBER := 0;
    	i NUMBER := 0;
    	enreg C_Staging%ROWTYPE;
    BEGIN
    	SELECT COUNT (HostPartID) into demToT
    	FROM Staging
    	WHERE MONTHS_BETWEEN(sysdate, SalesOrderMatAvailDt) <= nbYear*12;
    	threshold := 80/100 * demTot;
    	LOOP
    		FETCH C_Staging INTO enreg;
    		EXIT WHEN C_Staging%NOTFOUND;
    		i := i + enreg.I;
    			UPDATE Product 
    				SET Frequency='High'
    				WHERE HostPartID=enreg.HostPartID;
    		EXIT WHEN i >= threshold;
    	END LOOP;
    	LOOP
    		FETCH C_Staging INTO enreg;
    		EXIT WHEN C_Staging%NOTFOUND;
    			UPDATE Product 
    				SET Frequency='Low'
    				WHERE HostPartID=enreg.HostPartID;
    	END LOOP;	
    END;
    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    *
    ERREUR à la ligne 1 :
    ORA-01001: curseur non valide
    ORA-06512: à "HISTOADM.FREQUENCY_PRODUCT", ligne 18
    ORA-06512: à ligne 1
    En vous remerciant et vous souhaitant une agréable journée !!!

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    enreg n'est pas un rowtype...

    essaye :
    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
    CREATE OR REPLACE PROCEDURE frequency_product (nbYear NUMBER) IS
    	CURSOR C_Staging IS
    		SELECT  HostPartID, COUNT (HostPartID) AS I
    		FROM Staging
    		WHERE MONTHS_BETWEEN(sysdate, SalesOrderMatAvailDt) <= nbYear*12
    		GROUP BY HostPartID
    		ORDER BY I DESC;
    	demToT NUMBER;
    	threshold NUMBER := 0;
    	i NUMBER := 0;
    	v_host HostPartID%TYPE;
            nb_host NUMBER;
    BEGIN
    	SELECT COUNT (HostPartID) into demToT
    	FROM Staging
    	WHERE MONTHS_BETWEEN(sysdate, SalesOrderMatAvailDt) <= nbYear*12;
    	threshold := 80/100 * demTot;
    	LOOP
    		FETCH C_Staging INTO v_host,nb_host ;
    		EXIT WHEN C_Staging%NOTFOUND;
    		i := i + nb_host;
    			UPDATE Product 
    				SET Frequency='High'
    				WHERE HostPartID=v_host;
    		EXIT WHEN i >= threshold;
    	END LOOP;
    	LOOP
    		FETCH C_Staging INTO v_host,nb_host;
    		EXIT WHEN C_Staging%NOTFOUND;
    			UPDATE Product 
    				SET Frequency='Low'
    				WHERE HostPartID=v_host;
    	END LOOP;	
    END;

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Merci de m'aider c'est super sympa...

    J'ai tester ton code, de meme il doit y avoir une erreur vise à vis de ta nouvelle variable (peu etre une faute d'orthographe)...
    Je vais mieux regarder mais je voudrais te poser une question:

    Dans mon curseur, je récupere bien des tuples avec plusieurs champs, donc pourquoi cela ne pourrait pas être un rowtype?

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Le rowtype sur le curseur devrait fonctionner.

    Il semble qu'on pouvait en 9i déclarer un curseur implicite et faire un fetch dessus mais que c'était un bug et qu'en 10g ce n'est plus possible.

    Quelle est votre version d'Oracle ?

  5. #5
    Membre Expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Par défaut
    Dans le code il manque:
    -l'ouverture du curseur qui devrait expliquer l'erreur
    -la fermeture du curseur.

  6. #6
    Expert confirmé
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Par défaut
    Oui, vous ne pouvez utiliser l'instruction FETCH que sur un curseur ouvert (OPEN)

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    574
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2004
    Messages : 574
    Par défaut
    Oui c'était bien à cause du manque de OPEN CURSEUR...
    C'est vraiment un oublie bete mais je n'arrivais plus à le voir à force de faire des procédures à la chaine...

    Je te remercie beaucoup !!!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 31/08/2004, 11h45
  2. [Eclipse 3][compilation] probleme
    Par seb_fou dans le forum Eclipse Java
    Réponses: 8
    Dernier message: 24/08/2004, 16h38
  3. Réponses: 1
    Dernier message: 11/06/2004, 11h58
  4. [Kylix] probleme execution programme
    Par vin's dans le forum EDI
    Réponses: 1
    Dernier message: 31/03/2004, 12h25
  5. [Kylix] Compilation OK Execution pas ok
    Par teurf dans le forum EDI
    Réponses: 14
    Dernier message: 03/12/2002, 15h10

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