0

データベース構築の一部として、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 の除外句を削除しようとしましたが、同じエラーが発生しました。

4

2 に答える 2