
Oracle: Compilar objetos inválidos en un schema
Autor: fjavimartin
Fecha de Creación: 04/08/2017
Categorías:
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;