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

Administration Oracle Discussion :

dbms_stats en dynamique


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 84
    Par défaut dbms_stats en dynamique
    Bonjour,
    J'alimente un dataware house composé de plusieurs tables partitionnées. tous les jours quelques partitions sont tronquées et réalimentées.
    Pour tout automatiser j'ai l'intention d'analyser ces partitions de façon dynamique dans une procédure.
    Voici le code que j'utilise et qui helas ne marche 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    CREATE OR REPLACE PROCEDURE "prc_AnalyseTablePartition" (pi_table_owner varchar2,
    pi_cnom_table varchar2 , pi_cyear varchar2) is
     
    CURSOR C_PARAM (p_table_owner varchar2,p_cnom_table varchar2 , p_cyear varchar2) is
    select distinct('dbms_stats.GATHER_TABLE_STATS(OWNNAME => ''' || p_table_owner || ''',TABNAME => ''' || ai.table_name ||''',PARTNAME =>  ''' || partition_name || ''' , CASCADE => FALSE, METHOD_OPT => ''FOR ALL INDEXED COLUMNS'', GRANULARITY => ''PARTITION'');') cleTexte
    from all_indexes ai,all_tab_partitions atp
    where atp.table_name = p_cnom_table
    and atp.table_owner = p_table_owner
    and substr(partition_name,5,4) >= p_cyear
    and atp.table_name = ai.table_name
    and atp.table_owner = ai.table_owner
    ;
     
     
    L_PARAM	C_PARAM%ROWTYPE;
     
    v_select varchar2(3000);  
    cursor1  integer;
    v_text   varchar2(300);
     
    begin
    Open C_PARAM(pi_table_owner,pi_cnom_table, pi_cyear);
       While (1=1)
       Loop
         Fetch C_PARAM into L_PARAM;
         If (C_PARAM%FOUND)
            Then
    	begin
    	  cursor1 := dbms_sql.open_cursor;
    	  dbms_sql.parse(cursor1, l_param.cleTexte, dbms_sql.native);
    	  dbms_sql.close_cursor(cursor1); 	 
                 End;		
             else
    	exit;
             end if;		
        End Loop;	
        close C_PARAM;
    end;

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par jj bzh
    qui helas ne marche pas.
    c'est vague...

  3. #3
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 84
    Par défaut
    à l'execution de cette procédure j'ai ces erreurs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ORA-00928: missing SELECT keyword
    ORA-06512: at "SYS.DBMS_SYS_SQL", line 826
    ORA-06512: at "SYS.DBMS_SQL", line 32
    ORA-06512: at "DEVDW.prc_AnalyseTablePartition", line 30
    ORA-06512: at line 11

  4. #4
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    déjà le curseur me parait complétement dingue... tu boucles jusqu'à ne plus avoir de ligne... je te conseille de lire ce tuto : http://sheikyerbouti.developpez.com/...=Chap1#L1.2.13

    et au lieu de DBMS_SQL, fait donc un EXECUTE IMMEDIATE : http://sheikyerbouti.developpez.com/...e=Chap1#L1.2.6

  5. #5
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    84
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 84
    Par défaut
    déjà le curseur me parait complétement dingue...
    c'est pas la boucle la + optimisé que je connaisse mais c'est mon dba qui l'a pondu ...
    Dans le lien le cout de la boucle est de x et dans ma boucle c'est x+1. Ma boucle est donc + couteuse, mais c'est pas dramatique.

    pour revenir à mon problème :
    Quand j'execute le select du curseur sous SQL plus , j'obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    dbms_stats.GATHER_TABLE_STATS(OWNNAME => 'DEVDW',
    TABNAME => 'VENTE_SITE_DEPT',PARTNAME =>  'PART200401' , 
    CASCADE => FALSE, METHOD_OPT => 'FOR ALL INDEXED COLUMNS', 
    GRANULARITY => 'PARTITION');
    Quand je reprend ce résultat et que je le lance toujours sous sql plus, cela fonctionne.

    Quand je le fait avec une procedure, cela ne fonctionne plus , ni avec execute immediate ou dbms_sql.
    Comment lancer un dbms_stats en dynamique ?

  6. #6
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Citation Envoyé par jj bzh
    Dans le lien le cout de la boucle est de x et dans ma boucle c'est x+1. Ma boucle est donc + couteuse, mais c'est pas dramatique.
    C'est pas un problème de perf mais de bonne pratique

    Citation Envoyé par jj bzh
    Quand je le fait avec une procedure, cela ne fonctionne plus , ni avec execute immediate ou dbms_sql.
    il ne faut pas mettre le ;

    ton DBA a l'air d'être un champion du dév

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

Discussions similaires

  1. Creation de fiche dynamique
    Par Mouss26 dans le forum C++Builder
    Réponses: 7
    Dernier message: 24/07/2002, 07h56
  2. comment creer un alias dynamique avec BDE et ODBC
    Par david33 dans le forum C++Builder
    Réponses: 2
    Dernier message: 12/07/2002, 11h50
  3. Création dynamique de TImages
    Par Dric dans le forum C++Builder
    Réponses: 10
    Dernier message: 08/07/2002, 12h36
  4. Réponses: 4
    Dernier message: 13/05/2002, 16h43
  5. repertoire temp dynamique
    Par killpilot dans le forum C
    Réponses: 2
    Dernier message: 26/04/2002, 16h19

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