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 :

Compter dynamiquement la chaîne la plus longue en parcourant les colonnes d'une table


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut Compter dynamiquement la chaîne la plus longue en parcourant les colonnes d'une table
    Salut à tous,
    je suis en train d'écrire un script PL/SQL qui détermine la taille des colonnes d'une table en utilisant un curseur qui parcourt les noms de colonnes.

    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
     
    set serveroutput on ; 
     
    declare
     
    cursor c_colonne is  Select COLUMN_NAME from USER_TAB_COLUMNS where TABLE_NAME like 'ma_table' ;
    nom_col USER_TAB_COLUMNS.COLUMN_NAME%TYPE ; 
    taille_col integer :=0 ; 
     
    begin
     dbms_output.put_line('start') ;
     
    open c_colonne ;
    loop
         Fetch c_colonne into nom_col ;
         select max(length(nom_col))  into taille_col from ma_table ; 
     
         dbms_output.put_line('-------nom_col : '|| nom_col||'----------------') ;
         dbms_output.put_line('nom_col : '|| nom_col||'  taille :'||taille_col) ;
        Exit when c_colonne%NOTFOUND;
    end loop;
     
    close c_colonne ;
    dbms_output.put_line('end') ;
    end ;

    Mon script à un problème lors de l'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(length(nom_col))  into taille_col from ma_table ;
    Le script compte la taille de la chaine du nom de la colonne :
    par exemple lorsque nom_col vaut col_1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(length(nom_col))  into taille_col from ma_table ;
    taille_col vaut 5 car col_1 comporte 5 caractères.

    Tout se passe comme ci le script interpretait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(length('col_1'))  into taille_col from ma_table ;
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select max(length(col_1))  into taille_col from ma_table ;
    Comment est ce que je peux faire pour résoudre ce pb ?


    merci d'avance.
    ben

  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
    Il faut faire du SQL dynamique avec EXECUTE IMMEDIATE.

  3. #3
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Citation Envoyé par ben.IT Voir le message
    Tout se passe comme ci le script interpretait ...
    Exactement !

    Comme le nom de la colonne n'est pas connu à l'avance, et donc ne figure pas en dur dans votre code, il faut passer par du SQL dynamique comme l'indique Waldar.

    Quelque chose comme ça (exemple sur SCOTT.EMP, à tester en se connectant SCOTT) :
    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
    set serveroutput on
     
    declare
        req varchar2(100);
        nb    int;
    begin
        for i in (select column_name from user_tab_columns where table_name='EMP') loop
            req:='select max(length(' || i.column_name || ')) from emp';
    --        dbms_output.put_line(req);
            execute immediate req into nb;
            dbms_output.put_line(rpad(i.column_name, 10) || ' : ' || nb);
        end loop;
    end;
    /
     
    EMPNO      : 4
    ENAME      : 6
    JOB        : 9
    MGR        : 4
    HIREDATE   : 19
    SAL        : 4
    COMM       : 4
    DEPTNO     : 2

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 461
    Par défaut
    Et puis bien sûr, il y a aussi la technique consistant à générer les différentes requêtes, les enregistrer dans un spool, et exécuter le résultat.

    Tout ça doit être mis dans un fichier script que vous nommerez à votre guise, et qui doit être exécuté par @. (Un simple copier coller dans SQL*Plus ne convient pas).

    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
    define ficspool=t:\temp\tempsql.Sql
     
    set heading off
    set pagesize 0
    set feedback off
    set echo off
     
    spool &ficspool
     
    select 'select ''' || column_name || ' : '', max(length(' || column_name || ')) from emp;'
    from user_tab_columns
    where table_name='EMP';
     
    spool off
     
    @&ficspool
     
    -- host del &ficspool

  5. #5
    Membre éclairé Avatar de ben.IT
    Homme Profil pro
    Inscrit en
    Janvier 2009
    Messages
    431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 431
    Par défaut
    impec, c'est ok avec execute immediate.

    merci beaucoup à vous 2.

    à bientôt,
    ben

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 04/10/2010, 19h01
  2. Compter le nombre de colonnes d'une table
    Par Lord_Jago dans le forum Requêtes
    Réponses: 4
    Dernier message: 26/07/2006, 11h44
  3. SQL : compter les champs d'une table
    Par Bboy dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 26/10/2005, 16h02
  4. Réponses: 5
    Dernier message: 25/07/2005, 14h03
  5. Compter les lignes d une <TABLE>
    Par Invité(e) dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 21/01/2005, 14h43

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