データベース構築の一部として、DB 内のすべての無効なオブジェクトを再コンパイルする SQL があります。これは正常に機能していましたが、次のエラーが表示されます。
ORA-04047: object specified is incompatible with the flag specified
ORA-06512: at "SYS.DBMS_UTILITY", line 156
ORA-06512: at "SYS.DBMS_DDL", line 157
ORA-06512: at line 51
エディションベースの再定義用に多数のエディショニング ビューを作成したという事実と何か関係があるのでしょうか?
コードは次のとおりです。
DECLARE
v_counter INTEGER := 1;
CURSOR cur_invalid_objects
IS
SELECT object_name,
object_type
FROM user_objects
---*** exclude VIEW and MATERIALIZED VIEW object types
WHERE status = 'INVALID'
and object_type NOT IN ('VIEW','MATERIALIZED VIEW');
FUNCTION get_total_invalid_objects
RETURN INTEGER
IS
CURSOR get_total_invalid_objs_cur
IS
SELECT count(*)
FROM user_objects
---*** exclude VIEW and MATERIALIZED VIEW object types
WHERE status = 'INVALID'
AND object_type NOT IN ('VIEW','MATERIALIZED VIEW');
v_total INTEGER := 0;
BEGIN
OPEN get_total_invalid_objs_cur;
FETCH get_total_invalid_objs_cur
INTO v_total;
CLOSE get_total_invalid_objs_cur;
RETURN v_total;
END get_total_invalid_objects;
BEGIN
WHILE get_total_invalid_objects > 0
LOOP
IF v_counter <= 100 -- Failsafe: exit while loop if the objects cannot be recompiled after 100 tries
THEN
FOR cur_invalid_objects_rec IN cur_invalid_objects
LOOP
EXIT WHEN cur_invalid_objects%NOTFOUND;
dbms_ddl.alter_compile(cur_invalid_objects_rec.object_type,NULL,cur_invalid_objects_rec.object_name);
END LOOP;
v_counter := v_counter + 1;
ELSE
dbms_output.put_line('Unable to recompile objects to a status of: VALID. Please investigate further.');
EXIT;
END IF;
END LOOP;
END;
/
EXIT
/
VIEW の除外句を削除しようとしましたが、同じエラーが発生しました。