0

作为数据库构建的一部分,我们有一些重新编译数据库中所有无效对象的 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

0

支持的对象类型DBMS_DDL.ALTER_COMPILE有 PROCEDURE、FUNCTION、PACKAGE、PACKAGE BODY 和 TRIGGER(请参阅Oracle 文档)。

也许你有无效的同义词。尝试将您的查询限制为这些类型。

顺便说一句,还有DBMS_UTILITY.compile_schema(如 a_horse_with_no_name 所述)

于 2013-10-04T08:59:31.317 回答
0

也许这也有帮助: UTL_RECOMP

于 2013-10-04T10:29:28.927 回答