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

SQL Oracle Discussion :

Création de requêtes SQL


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut Création de requêtes SQL
    Bonjour a tous,

    J'ai un souci pour cree une requete SQL (je suis admin SAP, et franchement je suis pas un pro du SQL).

    Je suis sur ORACLE 9.2.0.6 Enterprise Edition.

    Ce que j'ai reussi a faire:
    Je veux connaitre le nombre de table qui ont un champs LONG ou LONG RAW,le nombre de lignes dans ces tables, tous ca groupe par tablespace.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    select TABLESPACE_NAME,count(table_name),SUM(NUM_ROWS) from DBA_TABLES where table_name IN (select TABLE_NAME from all_tab_columns where DATA_TYPE like 'LONG%') group by TABLESPACE_NAME;
    Voici ce que j'obtiens:
    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
     
    TABLESPACE_NAME   NB TABLE  NB RECORD
    --------------- ---------- ----------
    PSAPBTABD              206    3230712
    PSAPCLU2D               32
    PSAPCUSTD                5
    PSAPDDICD                9       3619
    PSAPDOCU2D               1          0
    PSAPEL46C2D              7     240326
    PSAPES46CD              16    1203020
    PSAPLOAD2D               1          0
    PSAPPOOLD              156     122770
    PSAPPROTD                9          4
    PSAPSOURCE2D            12       2699
    PSAPSTABD               59       2335
    PSAPUSER2D               1          1
    SYSTEM                  46
    Maintenant, ce que je desirerais obtenir:
    Deja, le resultats de ma requete ne me donne pas toujours le nombre de ligne...alors que les tables sont pleines...deja si on peut regler ca

    Ensuite, j'amerais avoir les infos suivantes dans ma requete:
    Total de la taille en Mo des tables avec un champ LONG ou LONG RAW.
    Nb de tables qui ont 0 lignes (ou qui sont NULL)
    Nb de tables qui ont + de 0 lignes

    A mon niveau , obtenir toute ces infos dans une requetes, c'est mission impossible

    Merci beaucoup de votre aide

  2. #2
    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
    Citation Envoyé par vorta251 Voir le message
    ...
    Deja, le resultats de ma requete ne me donne pas toujours le nombre de ligne...alors que les tables sont pleines...deja si on peut regler ca
    ...
    Num_Rows est null si les statistiques ne sont pas calculé.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    C'est exact.

    J'ai creuse un peu le sujet, au depart j'etais partis pour utiliser une commande de mise a jour des stats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    exec DBMS_STATS.GATHER_SCHEMA_STATS( OWNNAME => 'SAPR3', BLOCK_SAMPLE => FALSE, DEGREE => 2, GRANULARITY => 'ALL' ,CASCADE => TRUE );
    Mais comme ma base heberge SAP, j'ai lu que ce n'etait pas conseiller d'utiliser autre chose que les outils SAP.

    Resultat des courses les stats sont incompletes de facon delibere...

    Je m'oriente donc vers une autre solution.
    Dans ma requetes je vais faire un count sur les tables qui ont un champ LONG/LRAW.

    Je vois pas trop comment articuler ca dans ma requete, donc si quelqu'un a une idee je suis preneurs!!

    Merci de votre aide

  4. #4
    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
    Il te faut employer du SQL dynamique. Je pense que tu devrait créer un script SQL ou une procédure pipelined, qui calcule via plusieurs requête SQL ce que tu a besoin.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    Merci de tes indications mnitu!

    Bon, la je suis en galere :-D

    J'ai cree une vue d'apres dba_segments pour voir chaque table avec son tablespace et sa taille en Mo.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    create view tab_long (TABLESPACE_NAME,TABLE_NAME,TAILLE_MO)
    as select TABLESPACE_NAME,SEGMENT_NAME,lpad(substr(round(bytes/ (1024*1024),1),1,10),10) as Mo 
    from dba_segments 
    where SEGMENT_TYPE = 'TABLE';
    Mon idée c'etait de faire une boucle dans ma vue (comme tu me l'as suggere).

    ca ferait qqch comme ca (la on est en mode syntax unix/sql/n'importe quoi):

    for TABLE in (select TABLE_NAME from tab_long)
    do
    if [ select TABLE_NAME from all_tab_columns where TABLE_NAME = $TABLE and DATA_TYPE like 'LONG%' ]
    then
    echo $TABLE
    select count(*) from $TABLE;
    fi
    done

    Est ce que tu peux m'orienter (j'ai aucune connaissance PL/SQL...)?

    Merci!

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 9
    Par défaut
    Je tiens le bon bout!!

    J'ai pillé sans vergogne un script trouvé ici : http://www.developpez.net/forums/sho...d.php?t=562178

    J'ai bricolé pour inclure mes requetes SQL
    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
     
    DECLARE
            v_enreg_1 VARCHAR2(50);
            v_enreg_2 VARCHAR2(50);
            v_rqy VARCHAR2(250);
            v_nb_ligne Number;
    BEGIN
     
      FOR v_enreg_1 IN (SELECT SEGMENT_NAME FROM dba_segments WHERE SEGMENT_TYPE = 'TABLE')
      LOOP
         FOR v_enreg_2 IN (SELECT TABLE_NAME FROM all_tab_columns WHERE table_name = v_enreg_1.segment_name  AND data_type like 'LONG%')
         LOOP
               v_rqy := 'SELECT count(*) FROM '||v_enreg_1.segment_name||' '; 
               execute immediate v_rqy INTO v_nb_ligne;
               dbms_output.put_line(v_rqy);
               IF v_nb_ligne > 0 THEN
                    dbms_output.put_line( v_enreg_1.SEGMENT_name || ' --- nombre de ligne  : ' || v_nb_ligne );
               END IF;           
         END LOOP;
      END LOOP;
    END;
    Bon, maintenant ca fait des erreurs oracle...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    DECLARE
    *
    ERROR at line 1:
    ORA-00942: table or view does not exist
    ORA-06512: at line 13
    hmm, a priori je pense que v_nb_ligne n'est pas bien defini.... mais c'est pas tres clair...

  7. #7
    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
    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
     
    CREATE OR REPLACE Function TabCount(
      p_owner       In Varchar2,
      p_tabname     In Varchar2
    ) Return Number 
    Authid current_user
    Is
      l_Cnt   Number;
    Begin
      Execute Immediate 'Select count(*) From '||p_owner||'.'||p_tabname Into l_Cnt;
      Return l_Cnt;
    End;
    /
    Select tablespace_name, count(*), Sum(rowCnt), Sum(Bytes), Count(RowCnt)
    From (
        Select t.owner, t.table_name, t.tablespace_name, s.bytes,
               case t.rowCnt 
                 When 0 Then Null 
                 Else t.rowCnt 
               end RowCnt
        From 
            (SELECT owner, table_name, tablespace_name, TabCount(owner, table_name) RowCnt
              FROM DBA_TABLES 
            WHERE (owner, table_name) IN (SELECT owner, TABLE_NAME 
                                             FROM all_tab_columns 
                                            WHERE DATA_TYPE LIKE 'LONG%'
                                          )  
            ) t,
            (SELECT owner, segment_name, Sum(bytes) Bytes
                      FROM dba_segments 
                     Where SEGMENT_TYPE = 'TABLE'
                     Group by owner, segment_name
            ) s                                
        Where t.owner = s.owner
          And t.table_name = s.segment_name)
    Group By tablespace_name
    /

Discussions similaires

  1. DAO_Filter aide à la création de requête SQL
    Par cahnory dans le forum Contribuez / Téléchargez Sources et Outils
    Réponses: 4
    Dernier message: 27/05/2010, 11h31
  2. Problème création de requête SQL
    Par Snowwolf dans le forum Débuter
    Réponses: 2
    Dernier message: 06/03/2008, 15h16
  3. Logiciel création requêtes SQL pour SQL2000
    Par Thomad dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 12/06/2006, 09h06
  4. Soucis de création de requêtes sql
    Par Zebeber dans le forum Requêtes et SQL.
    Réponses: 11
    Dernier message: 26/05/2006, 11h13
  5. Création d'une table par requête SQL
    Par mister3957 dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 26/05/2006, 09h30

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