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

Oracle Discussion :

ordre de compilation des vues (intégré dans la FAQ)


Sujet :

Oracle

  1. #1
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut ordre de compilation des vues (intégré dans la FAQ)
    Bonjour à tous,
    dans un schema de la base j'ai un ensemble de vue non compilé pour les compilé j'ai utilisé 2 façon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT 'ALTER VIEW ' || a.owner || '.' || a.object_name || ' COMPILE;'
    FROM    all_objects a
    WHERE   a.object_type = 'VIEW'
    AND     a.status      = 'INVALID'
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dbms_utility.compile_schema('Scott',TRUE);
    mais dans les deux cas ça ne marche pas comme il faut puisque j'ai certaines vue qui dependent des autres.
    donc il faut compiler les vue dans le bon ordre puisque si v1 depend de v2 il faut compilé v1 ensuite v2.
    y a-t-il un moyen pour determiner le bon ordre de compilation des vues ?

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    le script $ORACLE_HOME/rdbms/admin/utlrp.sql devrait faire l'affaire. Eventuellement, regarde son contenu pour voit comment il fait

  3. #3
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    selon la doc, dbms_utility recompile les procedures, functions, packages, et triggers, mais pas les vues.

    le plus simple est bien sûr d'employé @?/rdbms/admin/utlrp , mais pour connaitre les dépendences, il existe une vue, DBA_DEPENDENCIES

  4. #4
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    utiliser utlrp.sql revient à utiliser le package UTL_RECOMP non ?
    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
    UTL_RECOMP.RECOMP_PARALLEL(4, 'SCOTT');
    end;
    c'est la même chose ?

  5. #5
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Citation Envoyé par Oraman
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    begin
    UTL_RECOMP.RECOMP_PARALLEL(4, 'SCOTT');
    end;
    c'est OK pour recompiler tes vues
    utlrp a encore d'autres fonctionalité, comme tu as pu le voir dans rdbms/admin, dont réactiver les index

  6. #6
    Membre habitué
    Inscrit en
    Août 2006
    Messages
    181
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 181
    Points : 166
    Points
    166
    Par défaut
    Citation Envoyé par laurentschneider
    c'est OK pour recompiler tes vues
    utlrp a encore d'autres fonctionalité, comme tu as pu le voir dans rdbms/admin, dont réactiver les index
    c'est pour cela je préfère utiliser UTL_RECOMP.RECOMP_PARALLEL ça fait l'affaire

  7. #7
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Grâce au mécanisme de compilation automatique à l'exécution d'un objet invalude, Oracle va compiler toutes les vues dépendantes pour les exécuter lors de l'exécution d'une vue. La procédure suivante qui exécute "à vide" toutes les vues du schéma courant qui ne sont pas référencées dans d'autres vues va donc compiler toutes les vues du schéma courant:

    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
     
     
    create or replace procedure ev
    is
    comm varchar2(100);
    res int;
    begin
    for lv in (select view_name from user_views where not exists 
                    (select referenced_name from user_dependencies where referenced_name = view_name))
        loop
            comm := 'SELECT COUNT(*) FROM  ' || lv.view_name || ' WHERE 1=0';
            dbms_output.put_line(comm || ' ...');
            execute immediate comm into res;
            dbms_output.put_line('... OK.');
        end loop;
    end;
    /

    Exemple:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
     
     
     
    SQL> create table t(x int, y int);
     
    Table created.
     
    SQL> create view v1 as select x,y from t;
     
    View created.
     
    SQL> create view v2 as select x,y from v1 where x >= 0;
     
    View created.
     
    SQL> create view v3 as select x,y from v2 where y >= 0;
     
    View created.
     
    SQL> 
    SQL> create view v4 as select x from t;
     
    View created.
     
    SQL> 
    SQL> --
    SQL> -- compiler toutes les vues
    SQL> --
    SQL> create or replace procedure ctv
      2  is
      3  comm varchar2(100);
      4  begin
      5  for lv in (select view_name from user_views)
      6  	 loop
      7  	     comm := 'ALTER VIEW ' || lv.view_name || ' COMPILE';
      8  	     dbms_output.put_line(comm || ' ...');
      9  	     execute immediate comm;
     10  	     dbms_output.put_line('... OK.');
     11  	 end loop;
     12  end;
     13  /
     
    Procedure created.
     
    SQL> show errors
    No errors.
    SQL> 
    SQL> --
    SQL> -- lister status des vues
    SQL> --
    SQL> 
    SQL> create or replace procedure lsv(cv out sys_refcursor)
      2  is
      3  begin
      4  open cv for
      5  	     'select object_name, status from user_objects where object_type = ''VIEW'' ';
      6  end;
      7  /
     
    Procedure created.
     
    SQL> show errors
    No errors.
    SQL> 
    SQL> 
    SQL> --
    SQL> -- executer les vues dont aucune autre vue ne dépend
    SQL> --
    SQL> 
    SQL> create or replace procedure ev
      2  is
      3  comm varchar2(100);
      4  res int;
      5  begin
      6  for lv in (select view_name from user_views where not exists
      7  		     (select referenced_name from user_dependencies where referenced_name = view_name))
      8  	 loop
      9  	     comm := 'SELECT COUNT(*) FROM  ' || lv.view_name || ' WHERE 1=0';
     10  	     dbms_output.put_line(comm || ' ...');
     11  	     execute immediate comm into res;
     12  	     dbms_output.put_line('... OK.');
     13  	 end loop;
     14  end;
     15  /
     
    Procedure created.
     
    SQL> show errors
    No errors.
    SQL> 
    SQL> 
    SQL> var rc refcursor;
    SQL> column object_name format a15
    SQL> 
    SQL> --
    SQL> -- execute v1, v4
    SQL> --
    SQL> set serveroutput on;
    SQL> alter table t add (z char(3));
     
    Table altered.
     
    SQL> exec lsv(:rc);
     
    PL/SQL procedure successfully completed.
     
    SQL> print :rc
     
    OBJECT_NAME     STATUS                                                          
    --------------- -------                                                         
    V1              INVALID                                                         
    V2              INVALID                                                         
    V3              INVALID                                                         
    V4              INVALID                                                         
     
    SQL> exec ev;
    SELECT COUNT(*) FROM  V4 WHERE 1=0 ...                                          
    ... OK.                                                                         
    SELECT COUNT(*) FROM  V3 WHERE 1=0 ...                                          
    ... OK.                                                                         
     
    PL/SQL procedure successfully completed.
     
    SQL> exec lsv(:rc);
     
    PL/SQL procedure successfully completed.
     
    SQL> print :rc
     
    OBJECT_NAME     STATUS                                                          
    --------------- -------                                                         
    V1              VALID                                                           
    V2              VALID                                                           
    V3              VALID                                                           
    V4              VALID                                                           
     
    SQL>

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

Discussions similaires

  1. Ordre de compilation des programmes
    Par ZRemi dans le forum Code::Blocks
    Réponses: 2
    Dernier message: 19/03/2015, 00h37
  2. [Jenkins] Ordre de compilation des projets au sein d'un .sln
    Par mikhailo dans le forum Intégration Continue
    Réponses: 1
    Dernier message: 08/03/2013, 14h07
  3. [SQL Server 2005] Ordre de création des vues
    Par nox75 dans le forum MS SQL Server
    Réponses: 9
    Dernier message: 17/07/2009, 16h28
  4. Ordre de compilation des fichiers
    Par dubsharry dans le forum Visual C++
    Réponses: 1
    Dernier message: 22/10/2007, 17h01
  5. Ordre de compilation des modules
    Par poulacou dans le forum Fortran
    Réponses: 1
    Dernier message: 28/02/2007, 15h15

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