Dba recompile invalid objects

De wiki.nexiat.fr
Aller à la navigation Aller à la recherche
Fiche express
Type Script SQL*Plus générateur de script
Domaine Administration (objets PL/SQL invalides)
Voir aussi Dba registry · Dba table info

Dba recompile invalid objects génère dynamiquement, puis exécute, une commande ALTER ... COMPILE pour chaque objet en statut INVALID dans dba_objects (procédures, fonctions, packages, corps de package, vues...). Pratique après un import, un DDL massif sur une table référencée par des vues/packages, ou une migration de version.

Script

-- Recompile tous les objets INVALID de la base : génère un script
-- de commandes ALTER ... COMPILE puis l'exécute immédiatement.

SET ECHO      OFF
SET FEEDBACK  OFF
SET HEADING   OFF
SET LINESIZE  180
SET PAGESIZE  0
SET TRIMSPOOL ON
SET VERIFY    OFF

CLEAR COLUMNS
CLEAR BREAKS
CLEAR COMPUTES

SPOOL compile.sql

SELECT 'ALTER ' ||
       DECODE(object_type, 'PACKAGE BODY', 'PACKAGE', object_type) ||
       ' ' || object_name ||
       ' COMPILE' ||
       DECODE(object_type, 'PACKAGE BODY', ' BODY;', ';')
FROM   dba_objects
WHERE  status = 'INVALID'
/

SPOOL OFF

@compile

SET FEEDBACK 6
SET HEADING  ON

Fonctionnement

  • Le DECODE gère le cas particulier des corps de package (PACKAGE BODY) : Oracle attend ALTER PACKAGE ... COMPILE BODY et non ALTER PACKAGE BODY ... COMPILE.
  • Le script généré (compile.sql) est exécuté juste après sa génération avec @compile.

Limites

  • Une seule passe : en cas de dépendances croisées (un objet A invalidé par un objet B qui vient d'être recompilé), il peut rester des objets INVALID après exécution — relancer le script une seconde fois suffit en général à les purger.
  • Ne gère pas les objets nécessitant un schéma qualifié différent de l'utilisateur connecté (pas de préfixe owner. dans le ALTER généré) : à exécuter connecté avec les privilèges adéquats, ou à adapter en ajoutant owner || '.' devant object_name.
  • Sur les versions récentes, UTL_RECOMP.RECOMP_SERIAL ou RECOMP_PARALLEL (fournis par Oracle) offrent une alternative plus robuste, avec parallélisation et meilleure gestion des dépendances.

Voir aussi

  • Dba registry — statut des composants installés, première étape avant d'investiguer des objets invalides après un patch
  • Dba table info — détail complet d'une table (colonnes, contraintes, index, triggers)