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;