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.