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;
23.04.2009 17:47
OlegON
 
Что-то пробежал мимо сразу... Вот еще одна запись из моего блокнотика:
Компиляция некомпилированных во всех схемах:
Код:
begin
for c in (select username from all_users)
loop
begin
dbms_utility.compile_schema(c.username,FALSE);
exception when others then null;
end;
end loop;
end;
надо сказать, достаточно глючная вещь и работает только в тепличных условиях... Но у меня стоит джобом.
06.05.2009 14:14
OlegON
 
Вот еще вариант:
Цитата:
Перекомпиляция процедур

запустить из серверного sqlplus с рабочей папкой C:\oracle\ora92\RDBMS\ADMIN\

@utlrp.sql;



Запускать несколько раз пока warning`ов не станет 0. Если остались warning`и то с ними нужно разобраться отдельно.

выглядеть будет примерно так:



OBJECTS WITH ERRORS

-------------------

0
суть этого скрипта
Код:
DECLARE
   threads pls_integer := &&1;
BEGIN
   utl_recomp.recomp_parallel(threads);
END;
/
06.05.2009 15:56
omorozov
 
Мда, тоже сегодня уже столкнулся. В девелоперской базе, только залили импорт, никто с ней не работает - появились 57 невалидных процедур.. пока откомпилил ручками через dbconsole, а сам думаю - с чего бы это.. придется видимо типа такого job-а вешать
09.06.2009 13:49
cb
 
Вот еще вариант набросал за 20 мин,только на мат.вьюх не проверял. И только в своей схеме.

Цитата:
OlegON declare s varchar2(255);
begin
for c in (
select object_name, object_type,
'ALTER ' || decode(object_type,'PACKAGE BODY','PACKAGE',object_type) || ' '|| object_name || ' COMPILE '||decode(object_type,'PACKAGE BODY','BODY','PACKAGE','PACKAGE','') TO_DO
from user_objects
where object_type in ('PACKAGE BODY','FUNCTION', 'PROCEDURE', 'PACKAGE', 'TRIGGER', 'VIEW','MATERIALIZED VIEW')
and status = 'INVALID'
order by 2
) loop
begin
s:= C.TO_DO;
execute immediate s;
exception
when others then null;
end;
end loop;
end;
Часовой пояс GMT +3, время: 00:10.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.