2015/06/03

Compilar automáticamente Vistas y procedimientos en Oracle

En ocasiones en bases de datos Oracle donde se almacenan procedimientos y vistas (sobre todo cuando hay relaciones entre estos elementos) pueden producirse errores que provocan que una compilación defectuosa incluso con elementos que estaban correctos.

En algunos casos estas "descompilaciones" de VIEWs y PROCEDUREs se dan con cierta frecuencia y generan el malfuncionamiento de la base de datos y las aplicaciones que la usan. No he conseguido determinar porqué se produce este fenómeno, pero al menos he visto el modo de poder detectarlo. Para los schemas de BD "MYSCHEMA1" y "MYSCHEMA2":


-- CHECK invalid views 
--  and 
-- invalid procedures (MYSCHEMA1, MYSCHEMA2)


SELECT OBJECT_NAME, OBJECT_TYPE, owner 
FROM all_objects 
WHERE object_type in ('PROCEDURE', 'VIEW') 
AND owner in ('MYSCHEMA1' , 'MYSCHEMA2') 
AND status = 'INVALID' 
; 

exit;

Una vez detectado los errores de compilación se puede forzar la ejecución de una compilación con la sentencia:


-- Recompile invalid views
--  and
-- Recompile invalid procedures

begin
  FOR cur IN (SELECT OBJECT_NAME, OBJECT_TYPE, owner
  FROM all_objects
  WHERE object_type in ('PROCEDURE', 'VIEW')
  AND owner in ('MYSCHEMA1', 'MYSCHEMA2')
  AND status = 'INVALID' ) LOOP
BEGIN
  if cur.OBJECT_TYPE = 'PACKAGE BODY' then
    EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.owner || '"."' || cur.OBJECT_NAME || '" compile body';
  else
    EXECUTE IMMEDIATE 'alter ' || cur.OBJECT_TYPE || ' "' || cur.owner || '"."' || cur.OBJECT_NAME || '" compile';
  end if;
EXCEPTION
  WHEN OTHERS THEN NULL;
END;
end loop;
end;
/
exit;

Uniendo estas 2 sentencias en un script y programando la tarea en CRON con cierta frecuencia, se puede actuar sin intervención humana sobre este problema automáticamente.
       
   

No hay comentarios: