Find invalid objects
1COL owner FOR a20
2COL object_name FOR a50
3COL subobject_name FOR a30
4
5SELECT owner, object_name, subobject_name, object_type, created
6FROM dba_objects WHERE status <> 'VALID' ORDER BY 2;
Recompile โ good practice after an import
1SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';
2-- 61
3
4@?/rdbms/admin/utlrp
5
6SELECT COUNT(*) FROM dba_objects WHERE status = 'INVALID';
7-- 40
Recompile with a PL/SQL cursor
1SET TERMOUT ON
2SET SERVEROUTPUT ON
3DECLARE
4 CURSOR cur_invalid_objects IS
5 SELECT object_name, object_type FROM user_objects
6 WHERE object_type IN ('PROCEDURE','FUNCTION','TRIGGER','SYNONYM','VIEW',
7 'MATERIALIZED VIEW','PACKAGE','PACKAGE BODY')
8 AND status = 'INVALID';
9 rec_columns cur_invalid_objects%ROWTYPE;
10 err_status NUMBER;
11BEGIN
12 dbms_output.enable(10000);
13 OPEN cur_invalid_objects;
14 LOOP
15 FETCH cur_invalid_objects INTO rec_columns;
16 EXIT WHEN cur_invalid_objects%NOTFOUND;
17 BEGIN
18 IF rec_columns.object_type IN ('VIEW','SYNONYM','MATERIALIZED VIEW','PACKAGE') THEN
19 dbms_output.put_line('Recompiling ' || rec_columns.object_type || ' ' || rec_columns.object_name);
20 EXECUTE IMMEDIATE 'ALTER ' || rec_columns.object_type || ' "' || rec_columns.object_name || '" COMPILE';
21 ELSIF rec_columns.object_type = 'PACKAGE BODY' THEN
22 dbms_output.put_line('Recompiling ' || rec_columns.object_type || ' ' || rec_columns.object_name);
23 EXECUTE IMMEDIATE 'ALTER PACKAGE "' || rec_columns.object_name || '" COMPILE BODY';
24 ELSE
25 dbms_output.put_line('Recompiling ' || rec_columns.object_type || ' ' || rec_columns.object_name);
26 dbms_ddl.alter_compile(rec_columns.object_type, NULL, rec_columns.object_name);
27 END IF;
28 EXCEPTION WHEN OTHERS THEN
29 err_status := SQLCODE;
30 dbms_output.put_line('Recompilation failed: ' || SQLERRM(err_status));
31 END;
32 END LOOP;
33 CLOSE cur_invalid_objects;
34END;
35/
Drop invalid objects
1SET SERVEROUTPUT ON
2DECLARE
3 CURSOR cur_invalid_objects IS
4 SELECT object_name, object_type FROM user_objects
5 WHERE object_type IN ('PROCEDURE','FUNCTION','TRIGGER','SYNONYM','VIEW',
6 'MATERIALIZED VIEW','PACKAGE','PACKAGE BODY')
7 AND status = 'INVALID';
8 rec_columns cur_invalid_objects%ROWTYPE;
9BEGIN
10 dbms_output.enable(10000);
11 OPEN cur_invalid_objects;
12 LOOP
13 FETCH cur_invalid_objects INTO rec_columns;
14 EXIT WHEN cur_invalid_objects%NOTFOUND;
15 dbms_output.put_line('DROP ' || rec_columns.object_type || ' ' || rec_columns.object_name);
16 EXECUTE IMMEDIATE 'DROP ' || rec_columns.object_type || ' ' || rec_columns.object_name;
17 END LOOP;
18 CLOSE cur_invalid_objects;
19END;
20/
`DROP ` does not map one-to-one for every object type (e.g. there is no `DROP PACKAGE BODY`, and `SYNONYM`/`TRIGGER` need care). Prefer recompiling; drop only objects you are sure you no longer need.