Сообщение отдельно
21.04.2009 17:41
OlegON
 
На самом деле достаточно часто воспринимают базу, как коробочный софт. Я уже не раз об этом писал, предлагал помощь в поддержке, игнорят... Потом приходится проделывать рутинную работу, например, по восстановлению истории цен. Есть такая особенность у СМа, что тихой сапой он игнорит наличие некомпилированных объектов и не выполняет определенную часть функций, скрывая это от пользователя, который потом ищет причины необъяснимых явлений.
Итак, для начала
Код:
select owner||'.'||object_name,object_type, status from dba_objects where status='INVALID' order by 1;
покажет, какие объекты повреждены.
Из скрипта сервиспака Супермага давненько выдрал процедурки и немного их поправил:
Компиляция вьюшек:
Код:
prompt ------------ compile views -----------;
begin
  for c in (select owner,object_name name from dba_objects
            where object_type = 'VIEW' and status='INVALID')
  Loop
    begin
      execute immediate
              'alter VIEW '||c.owner||'.' || c.name || ' compile';
    exception when others then null;
    end;
  end loop;
end;
/
надо отметить, что далеко не всегда удается успешно компилировать объекты, находящиеся в других схемах. Оптимайзер по этому поводу переключался на других пользователей. Далее по другим объектам:
Материализованных представлений в Супермаге нет, если вы не делали своих добавок, как например, я писал про ускорение заказов...
Код:
prompt ------------ compile matviews -----------;
begin
  for c in (select owner,object_name name from dba_objects
            where object_type = 'MATERIALIZED VIEW' and status='INVALID')
  Loop
    begin
      execute immediate
              'alter MATERIALIZED VIEW '||c.owner||'.' || c.name || ' compile';
    exception when others then null;
    end;
  end loop;
end;
/
Процедуры и функции и далее, смысл ясен из комментариев
Код:
prompt ----- compile functions vs procs -----;
begin
  for c in (select owner,object_type type,object_name name
            from dba_objects
            where object_type in ('FUNCTION','PROCEDURE')
              and status='INVALID')
  Loop
    begin
      execute immediate
              'alter ' || c.type || ' '||c.owner||'.'|| c.name || ' compile';
    exception when others then null;
    end;
  end loop;
end;
/
Код:
prompt -------------- compile packages ---------------;
begin
  for c in (select owner,object_type type, object_name name from all_objects
            where object_type in ('PACKAGE','PACKAGE BODY')
              and status='INVALID')
  Loop
    begin
      if (c.type='PACKAGE') then
              execute immediate
              'alter PACKAGE ' ||c.owner||'.'|| c.name || ' compile  PACKAGE';
      else
              execute immediate
              'alter PACKAGE ' ||c.owner||'.'|| c.name || ' compile BODY';
      end if;
    exception when others then null;
    end;
  end loop;
end;
/
Код:
prompt ----- compile triggers -----;
begin
  for c in (select owner,object_type type,object_name name
            from dba_objects
            where object_type = 'TRIGGER'
              and status='INVALID')
  Loop
    begin
      execute immediate
              'alter ' || c.type || ' '||c.owner||'.' || c.name || ' compile';
    exception when others then null;
    end;
  end loop;
end;
/
Соответственно, проверяем правильность компиляции (в случае сбоя никаких ошибок в скриптах выше выводиться не будет)
Код:
prompt ---------- invalid views -----------;
select 'VIEW' type,substr(object_name,1,90) name from dba_objects
where object_type = 'VIEW' and status='INVALID'
ORDER BY 2;
prompt ---------- invalid functions -----------------;
select 'FUNCTION' type,substr(object_name,1,90) name from dba_objects
where object_type = 'FUNCTION' and status='INVALID'
ORDER BY 2;
prompt ----------invalid procs ---------------;
select 'PROCEDURE' type,substr(object_name,1,90) name from dba_objects
where object_type = 'PROCEDURE' and status='INVALID'
ORDER BY 2;
prompt ----------- invalid packages -----------------;
select substr(object_type,1,13) type,substr(object_name,1,85) name from dba_objects
where object_type in ('PACKAGE','PACKAGE BODY') and status='INVALID'
ORDER BY 2,1;
prompt ----------- invalid triggers -----------------;
select 'TRIGGER' type,substr(object_name,1,90) name from dba_objects
where object_type = 'TRIGGER' and status='INVALID'
ORDER BY 2;