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 :

gestion des alias de table


Sujet :

PL/SQL Oracle

  1. #1
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    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 : 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
     
    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.

  2. #2
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    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)

  3. #3
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    VAR3 table2.champ3 varchar(20);
    ?????

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  4. #4
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Non,

    Soit tu mets
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  5. #5
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    voici mon script qui fonctionne très bien.

    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
    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 ????

  6. #6
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    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
    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;

  7. #7
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    oui c'est ce que je fais....

    voici l'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  8. #8
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Arf j'avais pas vu ta table s'appele GRADE en fait et pas GRADE_PE_HISTO.

    Donc

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    GRADE_PE_HISTO GRADE.GRADE%type;

  9. #9
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    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.

  10. #10
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    ok merci,

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  11. #11
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Essaye de comprendre ce qui a été dit avant.

    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.

  12. #12
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    ok je commence à comprendre avec vos réponses et mes diverses recherches.

    Par contre comment je déclare
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  13. #13
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    ... C'est écrit en gras dans mon dernier post dans la citation d'un autre post...

  14. #14
    Membre averti Avatar de PAYASS59
    Homme Profil pro
    Inscrit en
    Février 2005
    Messages
    755
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2005
    Messages : 755
    Points : 324
    Points
    324
    Par défaut
    ce qui donne ça ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    VAR4 SUM(CASE WHEN GTJOUR.CODHOR <> '000' AND GTJOUR.CODHOR <> 'RH' THEN 1 ELSE 0 END) INTEGER

  15. #15
    McM
    McM est déconnecté
    Expert éminent

    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
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut


    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)

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/09/2009, 18h38
  2. Gestion des relations entre tables
    Par Jasmine80 dans le forum DBDesigner
    Réponses: 10
    Dernier message: 09/02/2009, 15h33
  3. gestion des alias
    Par looping dans le forum Administration
    Réponses: 4
    Dernier message: 10/01/2009, 10h11
  4. Réponses: 7
    Dernier message: 26/01/2006, 12h19
  5. Gestion des Tables d'Object
    Par Laurent Dardenne dans le forum SQL
    Réponses: 27
    Dernier message: 17/04/2004, 12h39

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