Oracle: Compilar objetos inválidos en un schema

Cabecera Oracle: Compilar objetos inválidos en un schema

Oracle: Compilar objetos inválidos en un schema

  • Autor: fjavimartin

  • Fecha de Creación: 04/08/2017

  • Categorías:

    • Oracle,
    • Plsql,
    • Compile

Continuamos con Oracle, esta vez lo que haremos será un procedimiento que recorra todos los objetos en estado inválido de nuestro schema y lo compilaremos.

Oracle tiene una característica fundamental y es que nos ofrece vistas de sistema para controlar casi cualquier cosa. Para nuestro procedimiento utilizaremos la vista all_objects. Esta vista, entre otras cosas, nos ofrecerá información sobre todos los objetos creados en la base de datos entre los que se encuentra el propietario, nombre del objeto, tipo del objeto (sinónimo, tabla, etc) y su estado.

Nuestro procedimiento recorrerá la vista anterior para después poder compilar todos los objetos con estado ‘INVALID’. Obviamente, no todos los objetos se compilan de la misma manera por lo que estableceremos una llamada distinta para compilar procedimientos o para procesar el resto de objetos.

Para compilar todos los objetos de un esquema podemos utilizar la instrucción ‘EXEC DBMS_UTILITY.compile_schema(schema => 'SCOTT');’ , el problema de esta instrucción es que perderemos el control sobre los objetos que compila. En nuestro procedimiento compilaremos los objetos uno por uno controlando cualquier mensaje de error posible al menos para saber que está ocurriendo durante todo el proceso.

Os dejo el procedimiento y espero que lo disfrutéis.

Saludos.

PROCEDURE compilaObjetos
   IS
      CURSOR c_obj
      IS
         SELECT owner, object_name, object_type
           FROM all_objects
          WHERE owner = 'MISCHEMA' AND STATUS = 'INVALID';

      r_obj      c_obj%ROWTYPE;
      plsql      VARCHAR2 (250);
      err_code   VARCHAR2 (200);
      err_msg    VARCHAR2 (100);
      contador   INTEGER := 0;
   BEGIN
      DBMS_OUTPUT.PUT_LINE  ('Inicio compilaObjetos',
                            'compilaObjetos',
                            'INFO',
                            2);

      OPEN c_obj;

      LOOP
         FETCH c_obj INTO r_obj;

         EXIT WHEN c_obj%NOTFOUND;

         IF (r_obj.object_type = 'PACKAGE BODY')
         THEN
            plsql :=
                  'alter PACKAGE '
               || r_obj.owner
               || '.'
               || r_obj.object_name
               || ' compile debug';
         ELSE
            plsql :=
                  'alter '
               || r_obj.object_type
               || ' '
               || r_obj.owner
               || '.'
               || r_obj.object_name
               || ' compile';
         END IF;

         BEGIN
            EXECUTE IMMEDIATE plsql;

            DBMS_OUTPUT.PUT_LINE (
               r_obj.owner || '.' || r_obj.object_name || ' Compilado',
               'compilaObjetos',
               'INFO',
               2);
            contador := contador + 1;
         EXCEPTION
            WHEN OTHERS
            THEN
               err_code := SQLCODE;
               err_msg := SUBSTR (SQLERRM, 1, 200);
               DBMS_OUTPUT.PUT_LINE (
                  plsql || ' ' || err_code || ' Error: ' || err_msg,
                  'compilaObjetos',
                  'ERROR',
                  2);
         END;
      END LOOP;

      CLOSE c_obj;

      DBMS_OUTPUT.PUT_LINE (contador || ' Objetos compilados',
                            'compilaObjetos',
                            'INFO',
                            2);
      DBMS_OUTPUT.PUT_LINE ('Fin Objetos Compilados',
                            'compilaObjetos',
                            'INFO',
                            2);
   END;

 

Todos los Derechos Reservados © 2016

Funciona con Drupal