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 :

Afficher un tableau


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut Afficher un tableau
    Bonjour,
    Je débute en PL/SQL et j'aimerais afficher le résultat d'une requête qui se présente sous forme d'un tableau. J'ai déclaré une variable alpha (Modal2) qui n'est pas adaptée je suppose car j'ai un message d’erreur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Rapport d'erreur :
    ORA-00904: "C"."COL_" : identificateur non valide
    ORA-06512: à ligne 13
    00904. 00000 -  "%s: invalid identifier"
    *Cause:    
    *Action:
    Voici mon programme:


    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
    SET SERVEROUTPUT ON
    DECLARE 
    Modal varchar2(300);
    Modal2 varchar2(300);
    c NUMBER;
    cursor curs is 
    select  column_name col_, table_name tab_
    from all_tab_columns where owner = 'ZPUM' and 
     table_name not like '%TMP%' and column_name like 'IDNT_%' ;
     
     BEGIN
    FOR c IN curs  LOOP
    Modal:='select count(*),'||' '||c.col_ ||' '|| 'from '|| c.tab_|| ' ' ||'group by c.col_';
    EXECUTE IMMEDIATE Modal INTO Modal2;
    dbms_output.put_line (modal);
    --dbms_output.put_line (Modal2)
    END LOOP;
    END;
    /
    Je vous remercie d'avance!!

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Regardez la ligne 13 de votre code, vous avez fait deux choses différentes pour un même besoin concernant la valeur de c.col_.

  3. #3
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Salut Fabien,

    Je ne vois pas le pb à la ligne 13
    pour moi ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*),'||' '||c.col_ ||' '|| 'from '|| c.tab_|| ' ' ||'group by c.col_';
    est équivalent à quelque chose comme ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select count(*), indt from nom_table group by idnt
    si je mets en commentaire la commande Execute, cela marche.

    (moi je crois que c'est le fait de stocker Modal dans Modal2 qui pose pb, je dis ça, je dis rien)

    Merci.

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Ce que Waldar veut souligner c'est que ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*),'||' '||c.col_ ||' '|| 'from '|| c.tab_|| ' ' ||'group by c.col_';
    équivaut à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*), indt FROM nom_table GROUP BY c.col_

    Par contre ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*),'||' '||c.col_ ||' '|| 'from '|| c.tab_|| ' ' ||'group by '||c.col_;
    correspond à ce que vous recherchez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT count(*), indt FROM nom_table GROUP BY idnt
    et peut même être simplifié ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'select count(*), '||c.col_ ||' from '|| c.tab_||' group by '||c.col_;

  5. #5
    Membre Expert
    Avatar de MEGAMIND2
    Homme Profil pro
    Paris
    Inscrit en
    Janvier 2011
    Messages
    1 029
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Paris

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 029
    Par défaut
    Merci Scriuiw,

    C'est une coquille et je te remercie pour tes éclaircissements.

    Voici le 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
    19
    SET SERVEROUTPUT ON
    DECLARE 
    Modal varchar2(300);
    Modal2 varchar2(300);
    c NUMBER;
    cursor curs IS 
    SELECT  column_name col_, table_name tab_
    FROM all_tab_columns WHERE owner = 'ZPUM' AND 
     table_name NOT LIKE '%TMP%' AND column_name LIKE 'IDNT_%' ;
     
     BEGIN
    FOR c IN curs  LOOP
    Modal:='select count(*), '|| c.col_ || ' from  '|| c.tab_ ||' group by ' ||c.col_;
    EXECUTE IMMEDIATE Modal INTO Modal2;
    dbms_output.put_line (modal);
    --dbms_output.put_line (Modal2);
    END LOOP;
    END;
    /

    J'ai ce message dans la log:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Rapport d'erreur :
    ORA-00932: types de données incohérents ; attendu : - ; obtenu : -
    ORA-06512: à ligne 13
    00932. 00000 -  "inconsistent datatypes: expected %s got %s"
    *Cause:    
    *Action:
    Et je comprends très bien qu'on ne peut pas stocker Modal qui est un curseur pointant sur un tableau dans modal2 (varchar).

    Alors peut-on contourner ce pb?

  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
    Modal n'est qu'une modeste variable qui contient parce que vous l'avez décidé le texte d'une requête SQL. Cette requête ramène 2 choses: le résultat de l'évaluation de la fonction count(*) qui ne peut être qu'un type numérique, mais aussi la valeur de la colonne qui est stocké dans la variable c.col_.

    De plus votre requête peut ramener plusieurs tuples (nombre, valeur) qui ne peuvent pas être stockés dans une seule et unique variable de type varchar. Et rien ne garanti que le type de la colonne est toujours un scalaire convertible en varchar2.

    Pour l'instant commencez par positionner l'instruction qui affiche le contenu de la variable modal avant l'instruction qui exécute la requête. Au moins comme ça vous allez récupérer la requête qui plante ce qui vous permettra de la tester et de comprendre le problème qu'elle pose.

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

Discussions similaires

  1. [TP] [Débutant] Afficher un tableau en mode graphique
    Par xiungung dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 13/01/2006, 22h13
  2. Réponses: 3
    Dernier message: 26/09/2005, 22h24
  3. Comment afficher un tableau dans TStringGrid ?
    Par doubledj dans le forum Composants VCL
    Réponses: 3
    Dernier message: 19/09/2005, 02h21
  4. Réponses: 2
    Dernier message: 03/03/2005, 14h57
  5. AFFICHER UN TABLEAU DYNAMIQUE
    Par ghassenus dans le forum Langage
    Réponses: 2
    Dernier message: 28/12/2002, 14h19

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