Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Скрипт для перекомпиляции

57 views
Skip to first unread message

Yuri Chevtaykin

unread,
Aug 13, 2002, 10:49:29 PM8/13/02
to

Приветствую всех.

Oracle 8.1.5, Windows

Предисловие
После восстановления схемы (imp) или изменения ее структуры иногда возникают
объекты (процедуры, триггеры, представления) с ошибками компиляции. Для
того, чтобы все стало ОК, достаточно их перекомпилировать. В PL/SQL
Developer есть пункт меню Tools/Compile Invalid Objects..., который
вытаскивает на свет Божий все такие объекты и отображает их в одном списке,
а затем легким нажатием одной кнопки все они перекомпилируются, и приходит
счастье..

Кульминиция
Требуется подсказка, как выполнить то же самое (поиск и перекомпиляцию
объектов с ошибками компиляции) с помощью скрипта.

Заключение
Буду благодарен за дельный совет (а лучше, конечно, скрипт :-)

C Уважением,
Ю.Чевтайкин

geo...@mail.ru, geobo...@mtu-net.ru


Vladimir Begun

unread,
Aug 13, 2002, 11:55:16 PM8/13/02
to

Правильный script для 9i, который вполне возможно может быть
использован для 8.1.5 -- $ORACLE_HOME/rdbms/admin/utlrcmp.sql
Не уверен что это поддерживается Oracle (его запуск на 8i), но
на базе него можно написать что-то подобное для 8i, если там
всёже есть какая-то несовместимость. Из реальной жизни... полная
рекомпиляция базы -- около 120'000 invalid objects заняла у
меня около 3,5 часов (8 jobs) -- машина хорошая. Но при сложных
зависимостях может остаться что-то недокомпилированное.
--
Vladimir Begun | The statements and opinions expressed
http://vbegun.net/ | here are my own and do not necessarily
http://vbegun.net/wap/ | represent those of Oracle Corporation.
m...@vbegun.net |
ICQ#19259480/30% reachability|


Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru

Oleg Letaev

unread,
Aug 14, 2002, 3:50:41 AM8/14/02
to

В 8i тоже есть скрипт rdbms\admin\utlrp.sql.
Полезно почитать комментарии в нём перед использованием, там есть ряд
ограничений. В частности, не рекомендуется использовать при наличии
одновременных DDL-операций.

WBR,
Олег

--

Igor Smaglyuk

unread,
Aug 14, 2002, 5:19:17 AM8/14/02
to
> Требуется подсказка, как выполнить то же самое (поиск и перекомпиляцию
> объектов с ошибками компиляции) с помощью скрипта.

-- Recompile all objects in a schema
-- Sqlplus script
column u new_val uname
select user u from dual;

drop table compile_schema_tmp
/

create global temporary table compile_schema_tmp
( object_name varchar2(30),
object_type varchar2(30),
constraint compile_schema_tmp_pk
primary key(object_name,object_type)
)
on commit preserve rows
/
grant all on compile_schema_tmp to public
/

create or replace
procedure get_next_object_to_compile( p_username in varchar2,
p_cmd out varchar2,
p_obj out varchar2,
p_typ out varchar2 )
as
begin
select 'alter ' || object_type || ' '
|| p_username || '.' || object_name ||
decode( object_type, 'PACKAGE BODY', ' compile body',
' compile' ), object_name, object_type
into p_cmd, p_obj, p_typ
from dba_objects a
where owner = upper(p_username)
and status = 'INVALID'
and object_type <> 'UNDEFINED'
and not exists ( select null
from compile_schema_tmp b
where a.object_name = b.object_name
and a.object_type = b.object_type
)
and rownum = 1;

insert into compile_schema_tmp
( object_name, object_type )
values
( p_obj, p_typ );
end;
/

create or replace procedure compile_schema( p_username in varchar2 )
authid current_user
as
l_cmd varchar2(512);
l_obj dba_objects.object_name%type;
l_typ dba_objects.object_type%type;
begin
delete from &uname..compile_schema_tmp;

loop
get_next_object_to_compile( p_username, l_cmd, l_obj, l_typ );

dbms_output.put_line( l_cmd );
begin
execute immediate l_cmd;
dbms_output.put_line( 'Successful' );
exception
when others then
dbms_output.put_line( sqlerrm );
end;
dbms_output.put_line( chr(9) );
end loop;

exception
when no_data_found then NULL;
end;
/
grant execute on compile_schema to public
/

/*
And that is it ?V now you can go into any schema that is able to compile
some
objects and execute:

scott@TKYTE816> exec tkyte.compile_schema('scott')
alter PROCEDURE scott.ANALYZE_MY_TABLES compile
Successful

*/

Igor Smaglyuk

unread,
Aug 14, 2002, 7:40:59 AM8/14/02
to
Copyright by Thomas Kyte.
asktom.oracle.com


vas

unread,
Aug 14, 2002, 12:09:31 PM8/14/02
to

Zhirenkov Vitaly

unread,
Aug 16, 2002, 3:56:44 AM8/16/02
to

Yuri Chevtaykin <geobo...@mtu-net.ru> пишет:

могу предложить собственного приготовления:)

declare
p_Schema_Name constant varchar2(10) := '<schema_name>';
begin
for rec in (select DECODE(object_type,'PACKAGE
BODY','PACKAGE',object_type) o_t
,object_name o_n
,DECODE
(object_type,'PACKAGE BODY',' body','') a_b
,DECODE
(object_type,'PACKAGE',1,DECODE(object_type,'TRIGGER',2

,DECODE(object_type,'VIEW',3

,DECODE(object_type,'PACKAGE
BODY',4,0)))) sort
from all_objects where status
= 'INVALID' and owner = p_Schema_Name
order by sort, o_n) loop
execute
immediate 'alter '||rec.o_t||' '||p_Schema_Name||'.'||rec.o_n||'
compile'||rec.a_b;
end loop;
end;

YC> Приветствую всех.

YC> Oracle 8.1.5, Windows

YC> Предисловие
YC> После восстановления схемы (imp) или изменения ее
YC> структуры иногда возникают
YC> объекты (процедуры, триггеры, представления) с
YC> ошибками компиляции. Для
YC> того, чтобы все стало ОК, достаточно их
YC> перекомпилировать. В PL/SQL
YC> Developer есть пункт меню Tools/Compile Invalid
YC> Objects..., который
YC> вытаскивает на свет Божий все такие объекты и
YC> отображает их в одном списке,
YC> а затем легким нажатием одной кнопки все они
YC> перекомпилируются, и приходит
YC> счастье..

YC> Кульминиция
YC> Требуется подсказка, как выполнить то же самое
YC> (поиск и перекомпиляцию
YC> объектов с ошибками компиляции) с помощью
YC> скрипта.

YC> Заключение
YC> Буду благодарен за дельный совет (а лучше,
YC> конечно, скрипт :-)

YC> C Уважением,
YC> Ю.Чевтайкин

YC> geo...@mail.ru, geobo...@mtu-net.ru

--
_____
_ZVV_

0 new messages