lunes, 18 de marzo de 2013

Como re-compilar PROCEDURE,PACKAGE,PACKAGE BODY y FUNCTION en Oracle

Hola :

Cuando creamos campos nuevos en tablas de la base de datos o creamos tablas nuevas, muchos paquetes, procedimientos  y funciones de la base de datos quedan des-compilados debido a la relación que tienen con la nueva creación de objetos, dependiendo el lugar donde trabajen los dba´s se encargan de  re-compilar pero muchas veces no está por demás saberlo así que me puse a investigar una manera de hacerlo espero sea útil.

 Si tienes los suficientes permisos puedes ocupar dba_objects en lugar de all_objects

 /* Hola :-) */
set serverout on;

BEGIN
    FOR compilacion
    IN (  SELECT   'ALTER '
                   || DECODE (object_type,
                              'PACKAGE BODY', 'PACKAGE',
                              object_type)
                   || ' '
                   || owner
                   || '.'
                   || object_name
                   || ' compile '
                   || DECODE (object_type, 'PACKAGE BODY', 'BODY', '')

                       AS com
            FROM   all_objects
           WHERE   owner = 'PRUEBA'
                   AND object_type IN
                              ('PROCEDURE',
                               'PACKAGE',
                               'PACKAGE BODY',
                               'FUNCTION')
                   AND status = 'INVALID'
        ORDER BY   object_id ASC)

    LOOP
        BEGIN

            EXECUTE IMMEDIATE compilacion.com;

            DBMS_OUTPUT.put_line (compilacion.com || ' OK');
        EXCEPTION
            WHEN OTHERS

            THEN
                DBMS_OUTPUT.put_line (compilacion.com);
                DBMS_OUTPUT.put_line (SQLERRM);
        END;
    END LOOP;
END;
/

Saludos.