Comment compiler les objets invalides dans une base Oracle.
Comment lister les objets invalides d'un schéma utilisateur.
Pourquoi compiler ces objets.
Pourquoi sont-ils invalides.
Nous allons voir ici les principales méthodes qui permettent de compiler les objets invalides dans Oracle 10g.
Principalement les objets de type Trigger, Procédure, Fonction, View, Package sont invalidés par exemple suite à un changement opéré par une commande DDL sur une table, laquelle est utilisée dans
une vue ou un trigger, le passage d'un patch ou un Upgrade de la base de données.
Il faut savoir qu'Oracle recompile les objets qui ont le statut INVALID lorsqu'ils sont appelés et les passe donc en statut VALID si et seulement si il n'y a pas
d'erreurs de recompilation. Si vous supprimez une table qui est utilisée dans une procédure, cette procédure restera INVALID tant que le code PLSQL de celle-ci restera en l'état.
Pourquoi les compiler alors si oracle le fait comme un grand ? Simplement pour éviter une compilation online qui prends des ressources cpu et provoque des événements d'attentes en pleine
production c'est dire au moment ou une transaction utilisateur fait appel à cet objet invalide.
SQL> SELECT owner, object_type, object_name, status
FROM dba_objects
WHERE status = 'INVALID';
Commande SQL
SQL> ALTER TRIGGER nom_trigger COMPILE;
Package
EXECUTE DBMS_DDL.ALTER_COMPILE('TRIGGER', 'nom_schéma', 'nom_trigger');
Commande SQL
SQL> ALTER FUNCTION nom_fonction COMPILE;
Package
EXECUTE DBMS_DDL.ALTER_COMPILE('FUNCTION', 'nom_schéma', 'nom_fonction');
Commande SQL
SQL> ALTER PROCEDURE nom_procedure COMPILE;
Package
EXECUTE DBMS_DDL.ALTER_COMPILE('PROCEDURE', 'nom_schéma', 'nom_procedure');
Commande SQL
SQL> ALTER PACKAGE nom_package COMPILE; SQL> ALTER PACKAGE nom_package COMPILE BODY;
Package
EXECUTE DBMS_DDL.ALTER_COMPILE('PACKAGE', 'nom_schéma', 'nom_package');
-
EXECUTE DBMS_DDL.ALTER_COMPILE('PACKAGE BODY', 'nom_schéma', 'nom_package');
Commande SQL
SQL> ALTER VIEW nom_view COMPILE;
Executer en AS SYSDBA
EXECUTE DBMS_UTILITY.COMPILE_SCHEMA(schema => 'nom_schéma');
EXECUTE UTL_RECOMP.RECOMP_SERIAL('nom_schéma');
Executer en AS SYSDBA
EXECUTE UTL_RECOMP.RECOMP_SERIAL();
Commande SQL*PLUS
SQL> @?/rdbms/admin/utlrp.sql;