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 :

Incrémenter une variable dans un curseur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut Incrémenter une variable dans un curseur
    Bonjour,
    Voici mon premier message sur developpez.net !
    J'ai cherché un bon moment sans trouver de réponses qui soit plus ou moins lié a mon problème... Si jamais vous trouvez un sujet qui parle déjà de ce soucis, j'en suis désolé ...

    Alors voilà, je voudrai incrémenter ma variable v_no_rdv à chaque loop du cursor. De plus, cette variable doit débuter à partir de la valeur maximum de NOTRA.

    Pour que vous compreniez un peu plus mon délire:
    J'ai crée un bouton dans une application php qui va appelé mon curseur.
    Celui ci sert à copier les champs de certaines tables et de les coller dans une autre. Ma PK de cette autre table étant NOTRA, il faut qu'il soit unique! Pour cette raison, je dois récupérer le NOTRA max, la copier dans ma variable v_no_rdv et ensuite l'incrémenter à chaque lignes trouvé par le curseur Euh..J'espère que j'ai été assez compréhensible ? :/

    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
     
    CREATE OR REPLACE PROCEDURE TEMP IS
        v_rdv_no NUMBER;
        v_ben_no VARCHAR2(7);
        v_nom VARCHAR2(32);
        v_prenom VARCHAR2(30);
        v_ddnpatient DATE;
        v_sexepatient VARCHAR2(1);
        v_modetransport VARCHAR2(3);
     
    CURSOR imp_SIH IS
    SELECT   MAX (RDV.BRAN_TRANSPORT.NOTRA),
                  DIM.BEN.BEN_NO,
                  DIM.BEN.BEN_NOM_USUEL,
                  DIM.BEN.BEN_PRENOM_USUEL,
                  DIM.BEN.BEN_DDN,
                  DIM.BEN.BEN_SEXE_APP,
                  RDV.RDV_TRANS.TRANS_CODE  
     
    FROM DIM.BEN,RDV.RDV_TRANS,RDV.BRAN_TRANSPORT,RDV
    WHERE RDV.BENEF_NO = DIM.BEN.BEN_NO
    AND RDV.RDV_NO = RDV.RDV_TRANS.RDV_NO
    AND DIM.BEN.BEN_PRENOM_USUEL LIKE '%AIDEZMOISVP%';
     
     
    BEGIN
    OPEN imp_SIH;
     
    LOOP
     
    FETCH imp_SIH
     
    INTO    v_rdv_no,
               v_ben_no,
               v_nom,
               v_prenom,
               v_ddnpatient,
               v_sexepatient,
               v_modetransport;
     
     
     
    INSERT INTO BRAN_TRANSPORT ( NOTRA, NOMPATIENT, PRENOMPATIENT, typetransport, servicedepart, servicearrivee,MODETRANSPORT,DDNPATIENT,NOPATIENTSIH,regulation,SEXEPATIENT ) VALUES (v_rdv_no ,v_nom, v_prenom, 'A', 9 , 7, v_modetransport,v_ddnpatient ,v_ben_no,1,v_sexepatient);
     
    EXIT WHEN  imp_SIH%NOTFOUND;
    END LOOP;
    CLOSE imp_SIH;           
     
     
    commit;
     
     
        EXCEPTION
         WHEN NO_DATA_FOUND THEN
           NULL;
         WHEN OTHERS THEN
           -- Consider logging the error and then re-raise
           RAISE;
    END TEMP;
    /
    Merci d'avance !

    PS: vous remarquerez que pour mon premier message les balises code sont présentent contrairement à beaucoup d'autres messages

  2. #2
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Bonjour,

    Passe par une séquence que tu initialise avec le max de NOTRA existant, puis utilise sequence.NEXTVAL.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    INSERT INTO BRAN_TRANSPORT ( NOTRA, NOMPATIENT, PRENOMPATIENT, typetransport, servicedepart, servicearrivee,MODETRANSPORT,DDNPATIENT,NOPATIENTSIH,regulation,SEXEPATIENT ) 
    VALUES (seq.NEXTVAL ,v_nom, v_prenom, 'A', 9 , 7, v_modetransport,v_ddnpatient ,v_ben_no,1,v_sexepatient);
    Sinon tu incrementes dans ta boucle apres chaque insert :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    INSERT INTO BRAN_TRANSPORT ( NOTRA, NOMPATIENT, PRENOMPATIENT, typetransport, servicedepart, servicearrivee,MODETRANSPORT,DDNPATIENT,NOPATIENTSIH,regulation,SEXEPATIENT ) 
    VALUES (v_rdv_no ,v_nom, v_prenom, 'A', 9 , 7, v_modetransport,v_ddnpatient ,v_ben_no,1,v_sexepatient);
     
    v_rdv_no := v_rdv_no +1;

  3. #3
    McM
    McM est déconnecté
    Expert confirmé

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Billets dans le blog
    4
    Par défaut
    Attention : Une séquence ne garantit pas qu'il n'y ait pas de trous.

    Sinon, le code de la procédure TEMP peut être simplifié.
    1 : Préfère le FOR LOOP que le OPEN CURSOR, ça t'évitera de fermer explicitement le curseur.
    2 : Tu peux faire un insert select

    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
    CREATE OR REPLACE PROCEDURE TEMP IS
    	v NUMBER; 
    BEGIN
      SELECT NVL(MAX (RDV.BRAN_TRANSPORT.NOTRA),0) 
      INTO v
      FROM DIM.BEN,RDV.RDV_TRANS,RDV.BRAN_TRANSPORT,RDV
      WHERE RDV.BENEF_NO = DIM.BEN.BEN_NO
      AND RDV.RDV_NO = RDV.RDV_TRANS.RDV_NO
      AND DIM.BEN.BEN_PRENOM_USUEL LIKE '%AIDEZMOISVP%';
     
     
      INSERT INTO BRAN_TRANSPORT ( NOTRA, NOMPATIENT, PRENOMPATIENT, typetransport, servicedepart, servicearrivee,MODETRANSPORT,DDNPATIENT,NOPATIENTSIH,regulation,SEXEPATIENT ) 
      SELECT v + ROWNUM, DIM.BEN.BEN_NOM_USUEL,DIM.BEN.BEN_PRENOM_USUEL, 'A', 9 , 7, RDV.RDV_TRANS.TRANS_CODE,DIM.BEN.BEN_DDN ,DIM.BEN.BEN_NO,1,DIM.BEN.BEN_SEXE_APP);
      FROM DIM.BEN,RDV.RDV_TRANS,RDV.BRAN_TRANSPORT,RDV
      WHERE RDV.BENEF_NO = DIM.BEN.BEN_NO
      AND RDV.RDV_NO = RDV.RDV_TRANS.RDV_NO
      AND DIM.BEN.BEN_PRENOM_USUEL LIKE '%AIDEZMOISVP%';
     
      COMMIT;
     
    END TEMP;
    Pas d'exception à gérer (pas de no_data_found car max, et le raise sur other est implicite

  4. #4
    Membre très actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Par défaut
    Citation Envoyé par McM Voir le message
    Attention : Une séquence ne garanti pas qu'il n'y ait pas de trous.
    En effet mais elle garantit bien l'unicité, ce qui était demandé ici

  5. #5
    Membre extrêmement actif
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Billets dans le blog
    6
    Par défaut
    Citation Envoyé par McM Voir le message
    Attention : Une séquence ne garantit pas qu'il n'y ait pas de trous.
    c'est vrai McM, si on loope une insertion par une exception par exemple, donc ça va créer un trou, pour cela ,généralement je teste l'insertion avant que la sequence s'ncrémente pour ne pas créer des creux.

  6. #6
    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
    Citation Envoyé par boussafi Voir le message
    c'est vrai McM, si on loope une insertion par une exception par exemple, donc ça va créer un trou, pour cela ,généralement je teste l'insertion avant que la sequence s'ncrémente pour ne pas créer des creux.
    Vous perdez votre temps, votre test ne sert à rien.

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2010
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 412
    Par défaut
    Citation Envoyé par stanouu Voir le message
    Alors voilà, je voudrai incrémenter ma variable v_no_rdv à chaque loop du cursor. De plus, cette variable doit débuter à partir de la valeur maximum de NOTRA.

    Ma PK de cette autre table étant NOTRA, il faut qu'il soit unique!
    C'est quoi la partie importante? Que l'identifiant NOTRA soit unique, ou bien qu'il soit unique et qu'il continue a partir de la valeur precedente sans trou?

    Ca peut sembler pas important, mais en vrai ca l'est. Pas tant pour ce probleme en particulier, mais pour apprendre a rediger les specifications en ne melangeant pas le besoin et la solution technique.

    Sinon, une autre maniere de faire au lieu de devoir declarer le curseur et tout avant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i in (select champ1, champ2 from ...) loop
       --on utilise i.champ1 et i.champ2
       null;
    end loop;

  8. #8
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Citation Envoyé par stanouu Voir le message
    Bonjour,
    [code]
    CURSOR imp_SIH IS
    SELECT MAX (RDV.BRAN_TRANSPORT.NOTRA),
    DIM.BEN.BEN_NO,
    DIM.BEN.BEN_NOM_USUEL,
    DIM.BEN.BEN_PRENOM_USUEL,
    DIM.BEN.BEN_DDN,
    DIM.BEN.BEN_SEXE_APP,
    RDV.RDV_TRANS.TRANS_CODE

    FROM DIM.BEN,RDV.RDV_TRANS,RDV.BRAN_TRANSPORT,RDV
    WHERE RDV.BENEF_NO = DIM.BEN.BEN_NO
    AND RDV.RDV_NO = RDV.RDV_TRANS.RDV_NO
    AND DIM.BEN.BEN_PRENOM_USUEL LIKE '%AIDEZMOISVP%';
    Je suppose que votre application n'est pas mono-utilisateurs. Alors dans ce cas veuillez bien penser à la valeur qu'aura le max(notra) dans un environnement concurrent.

    Utilisez une séquence correctement initialisée. C'est votre solution.

  9. #9
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2011
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2011
    Messages : 4
    Par défaut
    Merci pour tous vos messages! c'est plaisant d'avoir une telle aide

    J'ai donc suivis vos conseils et initialisé une séquence.
    Elle fonctionnait à merveille jusqu'à ce que mon directeur ( je suis en stage ) me dise que je devais aller rechercher un rdv_no qui existe déjà

    Je pense que j'aurai d'autres questions d'ici peu!

    Merci encore !

    Ps: Utiliser une séquence était le mieux adapter pour mon cas ! [RESOLU]

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

Discussions similaires

  1. Incrémenter une variable dans un for-each
    Par enzostar dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 01/08/2012, 17h19
  2. Incrémentation du nom d'une variable dans une boucle
    Par Salamandar dans le forum SAS Base
    Réponses: 3
    Dernier message: 19/03/2010, 16h39
  3. Réponses: 2
    Dernier message: 30/03/2009, 12h21
  4. Incrémentation d'une variable dans une view
    Par austriker dans le forum Requêtes
    Réponses: 1
    Dernier message: 18/03/2009, 16h53
  5. Réponses: 37
    Dernier message: 02/03/2006, 01h58

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