Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
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 28/09/2011, 09h49   #1
Invité de passage
 
Homme Stan
Étudiant
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Stan
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
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 :
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
stanouu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 10h08   #2
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
Bonjour,

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

Code :
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 :
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;
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 11
Vieux 28/09/2011, 10h56   #3
Membre expérimenté
 
François
Inscription : février 2010
Messages : 306
Détails du profil
Informations personnelles :
Nom : François

Informations forums :
Inscription : février 2010
Messages : 306
Points : 536
Points : 536
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 :
1
2
3
4
FOR i IN (SELECT champ1, champ2 FROM ...) loop
   --on utilise i.champ1 et i.champ2
   NULL;
end loop;
Rams7s est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 10h59   #4
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 440
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 440
Points : 4 183
Points : 4 183
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 :
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
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2011, 11h16   #5
Membre confirmé
 
Homme Grégoire MARTIN
Ingénieur développement logiciels
Inscription : janvier 2011
Messages : 128
Détails du profil
Informations personnelles :
Nom : Homme Grégoire MARTIN
Âge : 32
Localisation : France, Hauts de Seine (Île de France)

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

Informations forums :
Inscription : janvier 2011
Messages : 128
Points : 225
Points : 225
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
__________________
Cordialement.
ORA-007 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 28/09/2011, 12h10   #6
Membre expérimenté
 
Homme Mohamed Houri
Inscription : mars 2010
Messages : 286
Détails du profil
Informations personnelles :
Nom : Homme Mohamed Houri
Localisation : France

Informations forums :
Inscription : mars 2010
Messages : 286
Points : 563
Points : 563
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.
__________________
Bien Cordialement
www.hourim.wordpress.com
Mohamed.Houri est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/10/2011, 08h47   #7
Invité de passage
 
Homme Stan
Étudiant
Inscription : septembre 2011
Messages : 4
Détails du profil
Informations personnelles :
Nom : Homme Stan
Localisation : France, Seine Maritime (Haute Normandie)

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : septembre 2011
Messages : 4
Points : 0
Points : 0
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]
stanouu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 10h02   #8
Membre éclairé
 
Avatar de boussafi
 
Homme
Ingénieur développement logiciels
Inscription : septembre 2007
Messages : 342
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Algérie

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

Informations forums :
Inscription : septembre 2007
Messages : 342
Points : 397
Points : 397
Envoyer un message via Yahoo à boussafi Envoyer un message via Skype™ à boussafi
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.
boussafi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 10h52   #9
Expert Confirmé Sénior
 
Avatar de mnitu
 
Homme Marius Nitu
Ingénieur développement logiciels
Inscription : octobre 2007
Messages : 3 311
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 311
Points : 5 813
Points : 5 813
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.
mnitu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h06.


 
 
 
 
Partenaires

Hébergement Web