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 02/03/2011, 17h20   #1
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
Par défaut gestion des alias de table

Bonjour,

Pour rappel je suis totalement novice en pl/sql et j'essaie de me débrouiller comme je peux, voic ce que je suis entrain de faire.

J'ai une requête SQL très complexe qui doit utiliser des alias de table.

Je vais faire un exemple simple :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
SET SERVEROUTPUT ON
DECLARE
 
VAR1 table1.champ1%type;
VAR2 table1.champ2%type;
VAR3 ??????%type;
 
CURSOR C1 IS 
            SELECT champ1,champ2,T2.champ3 FROM table_1, table_2 T2
BEGIN
 
OPEN C1;
LOOP
FETCH C1 INTO VAR1,VAR2,VAR3
EXIT ............
END LOOP;
END;

Comment puis-je déclarer ma VAR3 pour l'associer au champ3 de la table_2 qui utilise un alias ?

J'ai essayer toute les possiblités mais je ne trouve pas la solution
merci pour votre aide.
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/03/2011, 17h47   #2
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
VAR3 table2.champ3%type tout simplement.

Lorsque tu déclares ainsi une variable tu ne l'associe pas comme tu dis, tu indique simplement que ta variable est du même type.
C'est totalement indépendant de ce qu'il y a dans ton curseur.

Apres tu veux peut-être dire que table 2 n'est pas une table reelle mais issue d'un select ? Dans ce cas soit ton champ3 mappe sur un champ reel d'une table donc pas de souci, soit c'est le résultat d'un calcul et dans ce cas tu devras mettre le type de façon explicite (ex : VAR3 INTEGER)
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 03/03/2011, 08h32   #3
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
genre :

Code :
VAR3 table2.champ3 varchar(20);
?????

Code :
1
2
3
4
5
6
7
ça veut dire quoi ?
 
ERREUR à la ligne 11 :
ORA-06550: Ligne 11, colonne 19 :
PLS-00103: Symbole "VARCHAR" rencontré à la place d'un des symboles suivants :
:= . ( @ % ; not null range default character
Symbole ":=" a été substitué à "VARCHAR" pour continuer.
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 08h56   #4
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Non,

Soit tu mets
Code :
VAR3 table2.champ3%type;
Ce qui revient à dire, je déclare VAR3 du type du champ champ3 de la table table2.

Soit
Ce qui revient à dire, je déclare VAR3 de type VARCHAR2(20)
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 09h24   #5
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
voici mon script qui fonctionne très bien.

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
SET SERVEROUTPUT ON
DECLARE
date_debut date;
date_fin date;
date_arret date;
UF AGTAFFECT_HIS.CODUNIFON@rh.epsm%type;
MATRICULE_AGENT PERSO.MATRICULE%type;
DATE_CALENDRIER GTJOUR.DATE_%type;
DATE_DEB_AFF AGTAFFECT_HIS.datdebaff@rh.epsm%type;
DATE_FIN_AFF AGTAFFECT_HIS.datfinaff@rh.epsm%type;
CURSOR C1 IS 
            SELECT AGTAFFECT_HIS.CODUNIFON,
                   substr(PERSO.MATRICULE,3),
                   '01'||TO_CHAR(GTJOUR.DATE_,'/MM/')||TO_CHAR(GTJOUR.DATE_,'SYYYY'),
                    GREATEST(AGTAFFECT_HIS.datdebaff, TO_DATE('20110101','YYYYMMDD')),
                    LEAST(NVL(AGTAFFECT_HIS.datfinaff,TO_DATE('20110228','YYYYMMDD')),TO_DATE('20110228','YYYYMMDD'))
                FROM 
                    AGTAFFECT_HIS@rh.epsm,
                    GRADE  GRADE_PE_HISTO,
                    GTJOUR,
                    PERSO,
                    NIVEAU3,
                    NIVEAU4,
                    PE_HISTO PE_HISTO_03_NIVEAU3,
                    PE_HISTO PE_HISTO_04_NIVEAU4,
                    PE_HISTO PE_HISTO_08_GRADE,
                    TBABSJRS
                     WHERE 
                     ( PERSO.CODNIV3=NIVEAU3.CODNIV3(+)  )
                       AND  ( PE_HISTO_08_GRADE.CODE=GRADE_PE_HISTO.GRADE  )
                     AND ( PERSO.CODNIV4=NIVEAU4.CODNIV4(+)  )
                     AND  ( PE_HISTO_08_GRADE.INDTAB = 8  )
                     AND  ( GTJOUR.MATRICULE=PE_HISTO_03_NIVEAU3.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN PE_HISTO_03_NIVEAU3.DATDEB AND PE_HISTO_03_NIVEAU3.DATFIN  )
                    AND  ( GTJOUR.MATRICULE=PE_HISTO_04_NIVEAU4.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN PE_HISTO_04_NIVEAU4.DATDEB AND PE_HISTO_04_NIVEAU4.DATFIN  )
                    AND  ( GTJOUR.MATRICULE=PE_HISTO_08_GRADE.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN  PE_HISTO_08_GRADE.DATDEB AND PE_HISTO_08_GRADE.DATFIN  )
                    AND   ( TBABSJRS.MATRICULE(+)=GTJOUR.MATRICULE AND TBABSJRS.DATABS(+)=GTJOUR.DATE_  )
                     AND     AGTAFFECT_HIS.nummatagt = substr(PERSO.MATRICULE,3) 
                     AND  AGTAFFECT_HIS.nummatagt = '538488';
BEGIN
date_debut := TO_DATE('20110101','yyyymmdd');
date_arret := TO_DATE('20110228','yyyymmdd');
OPEN C1;
LOOP
FETCH C1 INTO UF,MATRICULE_AGENT,DATE_CALENDRIER,DATE_DEB_AFF,DATE_FIN_AFF;
date_fin:=LAST_DAY(date_debut);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(date_debut,'yyyymmdd')||'   '||TO_CHAR(date_fin,'yyyymmdd')||'   '||UF||'   '||MATRICULE_AGENT);
date_debut:=ADD_MONTHS(date_debut,+1);
EXIT WHEN date_debut>=date_arret;
END LOOP;
END;


Je veux rajouter dans mon select le champ : GRADE_PE_HISTO.GRADE AS CODE_GRADE,


et là impossible j'ai essayé toutes les déclarations possibles ...rien à faire ????
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h19   #6
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
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
SET SERVEROUTPUT ON
DECLARE
date_debut date;
date_fin date;
date_arret date;
UF AGTAFFECT_HIS.CODUNIFON@rh.epsm%type;
MATRICULE_AGENT PERSO.MATRICULE%type;
DATE_CALENDRIER GTJOUR.DATE_%type;
DATE_DEB_AFF AGTAFFECT_HIS.datdebaff@rh.epsm%type;
DATE_FIN_AFF AGTAFFECT_HIS.datfinaff@rh.epsm%type;
GRADE_PE_HISTO GRADE_PE_HISTO.GRADE%type;
CURSOR C1 IS 
            SELECT AGTAFFECT_HIS.CODUNIFON,
                   substr(PERSO.MATRICULE,3),
                   '01'||TO_CHAR(GTJOUR.DATE_,'/MM/')||TO_CHAR(GTJOUR.DATE_,'SYYYY'),
                    GREATEST(AGTAFFECT_HIS.datdebaff, TO_DATE('20110101','YYYYMMDD')),
                    LEAST(NVL(AGTAFFECT_HIS.datfinaff,TO_DATE('20110228','YYYYMMDD')),TO_DATE('20110228','YYYYMMDD')),
                    GRADE_PE_HISTO.GRADE AS CODE_GRADE                
FROM 
                    AGTAFFECT_HIS@rh.epsm,
                    GRADE  GRADE_PE_HISTO,
                    GTJOUR,
                    PERSO,
                    NIVEAU3,
                    NIVEAU4,
                    PE_HISTO PE_HISTO_03_NIVEAU3,
                    PE_HISTO PE_HISTO_04_NIVEAU4,
                    PE_HISTO PE_HISTO_08_GRADE,
                    TBABSJRS
                     WHERE 
                     ( PERSO.CODNIV3=NIVEAU3.CODNIV3(+)  )
                       AND  ( PE_HISTO_08_GRADE.CODE=GRADE_PE_HISTO.GRADE  )
                     AND ( PERSO.CODNIV4=NIVEAU4.CODNIV4(+)  )
                     AND  ( PE_HISTO_08_GRADE.INDTAB = 8  )
                     AND  ( GTJOUR.MATRICULE=PE_HISTO_03_NIVEAU3.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN PE_HISTO_03_NIVEAU3.DATDEB AND PE_HISTO_03_NIVEAU3.DATFIN  )
                    AND  ( GTJOUR.MATRICULE=PE_HISTO_04_NIVEAU4.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN PE_HISTO_04_NIVEAU4.DATDEB AND PE_HISTO_04_NIVEAU4.DATFIN  )
                    AND  ( GTJOUR.MATRICULE=PE_HISTO_08_GRADE.MATRICULE(+) AND GTJOUR.DATE_ BETWEEN  PE_HISTO_08_GRADE.DATDEB AND PE_HISTO_08_GRADE.DATFIN  )
                    AND   ( TBABSJRS.MATRICULE(+)=GTJOUR.MATRICULE AND TBABSJRS.DATABS(+)=GTJOUR.DATE_  )
                     AND     AGTAFFECT_HIS.nummatagt = substr(PERSO.MATRICULE,3) 
                     AND  AGTAFFECT_HIS.nummatagt = '538488';
BEGIN
date_debut := TO_DATE('20110101','yyyymmdd');
date_arret := TO_DATE('20110228','yyyymmdd');
OPEN C1;
LOOP
FETCH C1 INTO UF,MATRICULE_AGENT,DATE_CALENDRIER,DATE_DEB_AFF,DATE_FIN_AFF, GRADE_PE_HISTO;
date_fin:=LAST_DAY(date_debut);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(date_debut,'yyyymmdd')||'   '||TO_CHAR(date_fin,'yyyymmdd')||'   '||UF||'   '||MATRICULE_AGENT);
date_debut:=ADD_MONTHS(date_debut,+1);
EXIT WHEN date_debut>=date_arret;
END LOOP;
END;
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h30   #7
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
oui c'est ce que je fais....

voici l'erreur :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
GRADE_PE_HISTO GRADE_PE_HISTO.GRADE%type;
               *
ERREUR à la ligne 10 :
ORA-06550: Ligne 10, colonne 16 :
PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
ORA-06550: Ligne 10, colonne 16 :
PL/SQL: Item ignored
ORA-06550: Ligne 45, colonne 77 :
PLS-00320: déclaration de type de cette expression est incomplète ou mal structurée
ORA-06550: Ligne 45, colonne 1 :
PL/SQL: SQL Statement ignored
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h52   #8
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Arf j'avais pas vu ta table s'appele GRADE en fait et pas GRADE_PE_HISTO.

Donc

Code :
GRADE_PE_HISTO GRADE.GRADE%type;
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 10h55   #9
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173
On va reprendre du début :
1 alias de table n'est visible qu'à l'intérieur de la REQUETE.
Donc que tu aliasses ta table en toto, titi ou mon_super_alias, la déclaration en PL/SQL n'en sait rien car ce n'est pas du tout lié...

Variables de la partie déclaration :
Soit tu donnes le type en dur VARCHAR2(10), NUMBER...
Soit tu donnes le type d'une colonne d'une table. Exemple MATABLE.COLONNE1%type;


Dernière chose : Ne jamais utiliser des variables ayant le même nom que des colonnes de tes requêtes, c'est source de problèmes.
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h03   #10
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
ok merci,

derniere questionsi dans mon select je fais une formule (ex : sum...)

Code :
SUM(CASE WHEN GTJOUR.CODHOR <> '000' AND GTJOUR.CODHOR <> 'RH' THEN 1 ELSE 0 END) AS DOIT_TRAVAILLER
comment dois-je la déclarer ?


GTJOUR.CODHOR doit-il être déclarer même s'il n'est pas affiché en sortie ?
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h15   #11
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
Essaye de comprendre ce qui a été dit avant.

Citation:
Lorsque tu déclares ainsi une variable tu ne l'associe pas comme tu dis, tu indique simplement que ta variable est du même type.
C'est totalement indépendant de ce qu'il y a dans ton curseur.

Apres tu veux peut-être dire que table 2 n'est pas une table reelle mais issue d'un select ? Dans ce cas soit ton champ3 mappe sur un champ reel d'une table donc pas de souci, soit c'est le résultat d'un calcul et dans ce cas tu devras mettre le type de façon explicite (ex : VAR3 INTEGER)
Dans ce post tu as les réponses à tes questions.

Ce que tu déclares c'est indépendant de ton curseur, tu déclares des variables, point barre.
Apres tu utilises ces variables pour récupérer les valeurs issues de ton curseur, mais tu pourrais en faire autre chose. Donc si tu n'as pas besoin de la valeur contenue dans GTJOUR.CODHOR tu n'as pas besoin de déclarer de variable associée.
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 11h35   #12
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
ok je commence à comprendre avec vos réponses et mes diverses recherches.

Par contre comment je déclare
Code :
SUM(CASE WHEN GTJOUR.CODHOR <> '000' AND GTJOUR.CODHOR <> 'RH' THEN 1 ELSE 0 END)
qui se trouve dans mon SELECT.

Car ce résultat je vais en avoir besoin en sortie ?

merci
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h57   #13
Membre émérite
 
Avatar de Drizzt [Drone38]
 
Homme
Inscription : mai 2004
Messages : 739
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Isère (Rhône Alpes)

Informations forums :
Inscription : mai 2004
Messages : 739
Points : 979
Points : 979
... C'est écrit en gras dans mon dernier post dans la citation d'un autre post...
__________________
Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

(\ _ /)
(='.'=)
Voici Lapinou. Aidez le à conquérir le monde
(")-(") en le reproduisant
Drizzt [Drone38] est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 14h03   #14
Membre confirmé
 
Avatar de PAYASS59
 
Homme
Inscription : février 2005
Messages : 735
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 30
Localisation : France, Nord (Nord Pas de Calais)

Informations forums :
Inscription : février 2005
Messages : 735
Points : 291
Points : 291
ce qui donne ça ?
Code :
1
2
 
VAR4 SUM(CASE WHEN GTJOUR.CODHOR <> '000' AND GTJOUR.CODHOR <> 'RH' THEN 1 ELSE 0 END) INTEGER
__________________
Je préfère ma soif d'apprendre, à leurs certitudes de savoir....
PAYASS59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 15h31   #15
McM
Expert Confirmé Sénior
 
Inscription : juillet 2003
Messages : 3 437
Détails du profil
Informations forums :
Inscription : juillet 2003
Messages : 3 437
Points : 4 173
Points : 4 173


Citation:
Lorsque tu déclares ainsi une variable tu ne l'associe pas comme tu dis, tu indique simplement que ta variable est du même type.
C'est totalement indépendant de ce qu'il y a dans ton curseur.

Apres tu veux peut-être dire que table 2 n'est pas une table reelle mais issue d'un select ? Dans ce cas
soit ton champ3 mappe sur un champ reel d'une table donc pas de souci, soit c'est le résultat d'un calcul et dans ce cas tu devras mettre le type de façon explicite (ex : VAR3 INTEGER)
__________________
More Code : More Bugs. Less Code : Less Bugs
McM est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h12.


 
 
 
 
Partenaires

Hébergement Web