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

PL/SQL Oracle Discussion :

faire une diference entre la ligne N-1 - N


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 22
    Points
    22
    Par défaut faire une diference entre la ligne N-1 - N
    Bonjour,

    le titre n'est pas très explicite, alors voila ma problématique :
    j'ai une table : Matable
    dans cette table je dois mettre à jour un champs : poids
    dans cette table il y a un champs valeur.

    pour une ligne n, poid(n) = valeur(n)-valeur(n-1).

    exemple
    VALEUR POIDS
    ----------------
    4 null
    1 -3 (1-4)
    0 -1 (0-1)
    -2 -2 (-2-0)

    etc...

    Voici mon 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
    DECLARE
    	CURSOR CCur IS
    	SELECT a.valeur FROM MaTable a
    	FOR UPDATE MaTable.Poid;
    	valeur_courrant MaTable.valeur%TYPE;
    	valeur_precedent MaTable.valeur%TYPE;
    BEGIN
    	OPEN CCur;
    	LOOP
    		FETCH CCur INTO valeur_courrant;
    		EXIT WHEN CCur%NOTFOUND;
    			UPDATE MaTable
    			SET poids=valeur_courrant-valeur_precedent
    			WHERE CURRENT OF CCur;
    			valeur_precedent:=valeur_courrant;
    	END LOOP;
    	CLOSE CCur;
    END;
    1 - mon code ne fonctionne pas (mais ça à la limite c'st pas le plus grave)
    2 - Estce que la methode que j'emploi est "la meilleur"
    3 - j'avais pensé a utiliser des collections, mais je n'y suis pas arrivé

    Donner moi votr avis svp

    Merci

  2. #2
    Membre expérimenté Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Points : 1 332
    Points
    1 332
    Par défaut
    Quelle est ta version Oracle ?

    a partir de 9I tu peux utiliser les fonctions analytiques

    cf LAG

    http://lalystar.developpez.com/fonct...lytiques/#L3.2

    asktom.oracle.com tahiti.oracle.com otn.oracle.com

    Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson.


    phrase chinoise issue du Huainanzi

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    j'ai la version Oracle 7

    mais merci pour linfo

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    280
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 280
    Points : 344
    Points
    344
    Par défaut
    You've made my day fatsora.
    La fonction qu'il me fallait aujourd'hui

    ---
    Farid

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    75
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Mai 2008
    Messages : 75
    Points : 95
    Points
    95
    Par défaut
    Citation Envoyé par gdeon Voir le message
    Bonjour,

    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
    DECLARE
    	CURSOR CCur IS
    	SELECT a.valeur FROM MaTable a
    	FOR UPDATE MaTable.Poid;
    	valeur_courrant MaTable.valeur%TYPE;
    	valeur_precedent MaTable.valeur%TYPE;
    BEGIN
    	OPEN CCur;
    	LOOP
    		FETCH CCur INTO valeur_courrant;
    		EXIT WHEN CCur%NOTFOUND;
    			UPDATE MaTable
    			SET poids=valeur_courrant-valeur_precedent
    			WHERE CURRENT OF CCur;
    			valeur_precedent:=valeur_courrant;
    	END LOOP;
    	CLOSE CCur;
    END;

    1- ton curseur lui manque la clause "order by" sinon comment tu pourrais comparer les tuples renvoyés par le curseur.
    2- lors de la premiere iteration la variable "valeur_precedent" est nulle du coup je crois ke tu devras utiliser la fonction nvl.

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 31
    Points : 22
    Points
    22
    Par défaut
    MaTable est deja ordonnée

  7. #7
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    Citation Envoyé par gdeon Voir le message
    MaTable est deja ordonnée
    Dans une relation la théorie dit que non, ta relation (table) n'est pas ordonnée! La réalité la confirme! Il se peut que parfois, temporairement en interrogeant la table les données sortent dans la « bonne ordre »! C'est du hasard, un peu aide c'est vrai, mais sans order by ton traitement est erroné.

Discussions similaires

  1. [VBA-E] faire une boucle entre 2 feuilles
    Par MustOne dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 02/05/2007, 20h59
  2. comment faire une query entre 2 tables de 2 bases?
    Par ch_cu2 dans le forum Débuter
    Réponses: 1
    Dernier message: 12/12/2006, 21h45
  3. faire une différence entre deux tables
    Par geay dans le forum Langage SQL
    Réponses: 1
    Dernier message: 04/09/2006, 15h33
  4. Réponses: 4
    Dernier message: 22/08/2006, 11h20
  5. Faire une division entre deux chiffres?
    Par shun dans le forum Langage SQL
    Réponses: 9
    Dernier message: 09/09/2005, 16h37

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