Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем здесь собака порылась? / 7 сообщений из 7, страница 1 из 1
26.05.2003, 13:25:42
    #32168471
T34
T34
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
Такая процедура должна вызыватся при старте приложения и постараться рекомпилировать все Invalid-обьекты. По идее, если в принципе обьекты без ошибок, то процедура должна заканчиваться не то что counter = 100, но примерно counter = 4, так как большей вложенности обьектов у нас нет. Но почему то этого не проис ходит. Т.е. отдельные обьекты так и остаются Invalid... (а вручную их можно спокойно перекомпилить) В чем здесь собака порылась?

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
create or replace procedure ProcRecompile_Inv_Obj( aWithRecompile in Boolean, aOk out Boolean ) is
  cid      Integer;
  icounter Integer;

  CURSOR cr_Objects IS select Object_Name, Object_Type from user_objects
  where STATUS = 'INVALID' AND
    (object_Type = 'FUNCTION' OR object_Type = 'PROCEDURE' OR object_Type = 'VIEW' OR
     object_Type = 'TRIGGER' OR object_Type = 'PACKAGE' );
  lCrObjRec cr_Objects%RowType;

BEGIN
  cid := DBMS_SQL.OPEN_CURSOR;

  open CR_Objects;
  fetch CR_Objects into lCrObjRec;

  if aWithRecompile then

    icounter :=  0 ;
    while CR_Objects%found AND (icounter <  100 ) loop
      while CR_Objects%found loop
        begin
          DBMS_SQL.PARSE( cid, 'ALTER ' || lCrObjRec.Object_Type || ' ' || lCrObjRec.Object_Name || ' COMPILE', dbms_sql.v7 );
        exception WHEN OTHERS THEN
          null;
        end;
        fetch CR_Objects into lCrObjRec;
      end loop;
      close CR_Objects;

      icounter := icounter +  1 ;
      open CR_Objects;
      fetch CR_Objects into lCrObjRec;
    end loop;
    DBMS_SQL.CLOSE_CURSOR(cid);

  end if;

  aOk := not CR_Objects%found;  --//est' eshe INVALID-Objects ?!
 
  close CR_Objects;

exception WHEN OTHERS THEN
   aOk := false;
   if CR_Objects%ISOPEN then
      close CR_Objects;
   end if;
   if DBMS_SQL.IS_OPEN( cid ) then
     DBMS_SQL.CLOSE_CURSOR( cid );
   end if;
end ProcRecompile_Inv_Obj;
...
Рейтинг: 0 / 0
26.05.2003, 13:41:46
    #32168496
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
А с курсорами ты ничего не напутал.
Что-то ты не к месту закрываешь курсор в середине цикла по нему.
И выведи ошибку
Код: plaintext
1.
2.
3.
4.
5.
        begin
          DBMS_SQL.PARSE( cid, 'ALTER ' || lCrObjRec.Object_Type || ' ' || lCrObjRec.Object_Name || ' COMPILE', dbms_sql.v7 );
        exception WHEN OTHERS THEN
          null;
        end;

Например в какую-нибудь переменную, тебе же нужен список неудач.
А в конце процедуры уже сгенери свою ошибку сформированную из списка который возникли в цикле.
...
Рейтинг: 0 / 0
26.05.2003, 13:46:32
    #32168501
softy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
"Т.е. отдельные обьекты так и остаются Invalid"


У тебя обьекты наверняка взаимосвязаны. Например есть два вью. Второй вью основан на первом. Если первый вью инвалидный, то и второй тоже будет инвалидный. Я твой код не изучал, поэтому спрашиваю - у тебя соблюдается порядок перекомпиляции? Если нет, то можно до бесконечности эту процедуру запускать - если ты сначала компилишь второй вью, а потом первый.
...
Рейтинг: 0 / 0
26.05.2003, 13:51:34
    #32168508
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
Постойте а где
DBMS_SQL.EXECUTE ?
...
Рейтинг: 0 / 0
26.05.2003, 13:52:55
    #32168511
Eter Panji
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
И вообще здесь от DBMS_SQL выигрыша никакого нет
Лучше EXECUTE IMMEDIATE
...
Рейтинг: 0 / 0
26.05.2003, 13:57:45
    #32168517
Serge_kz
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
Если тебе надо перекомпилить все invalid объекты определённой схемы то делай вот так
dbms_utility.compile_schema('schema1', False);
...
Рейтинг: 0 / 0
26.05.2003, 13:58:43
    #32168519
Работник
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
В чем здесь собака порылась?
------------------------------------------------------------------------
--
-- Script for recompile all objects in Current user scheme
--
------------------------------------------------------------------------
declare
COMPILE_WITH_ERROR EXCEPTION;
PRAGMA EXCEPTION_INIT(COMPILE_WITH_ERROR,-24344);

IsExists number;
a_cursor number;
rowprocessed number;
i number;
nCount number;
isInvalid number;
strSQL varchar2(128);
Type ObjectName_Type is table OF varchar2(30) index by binary_integer;
Type ObjectType_Type is table OF varchar2(30) index by binary_integer;
tObjectName ObjectName_Type;
tObjectType ObjectType_Type;
lSQLErrm varchar2(64);
lSQLCode varchar2(32);
cursor crs1 is
select ao.object_name,ao.object_type
from user_objects ao
where ao.STATUS='INVALID'
and ao.object_type in ('PROCEDURE','FUNCTION','PACKAGE BODY','VIEW','TRIGGER')
order by ao.created;
cursor crs_check(iObjName varchar2, iObjType varchar2) is
select count(*) from user_objects
where object_name=iObjName and object_type=iObjType
and status='INVALID';
begin
i := 0;
for c1rec in crs1 loop
i := i + 1;
tObjectName(i) := c1rec.object_name;
tObjectType(i) := c1rec.object_type;
end loop;
nCount := i;
for i in 1..nCount loop
open crs_check(tObjectName(i),tObjectType(i));
fetch crs_check into isInvalid;
if isInvalid > 0 then
a_cursor:=dbms_sql.open_cursor;
if tObjectType(i)='PACKAGE BODY' then
strSQL := 'ALTER PACKAGE '||tObjectName(i)||' COMPILE BODY';
else
strSQL := 'ALTER '||tObjectType(i)||' '||tObjectName(i)||' COMPILE';
end if;
begin
dbms_sql.parse(a_cursor,strSQL,dbms_sql.v7);
exception
when COMPILE_WITH_ERROR then
null;
when others then
lSQLCode := SQLCODE;
lSQLErrm := SQLERRM;
rollback;
raise_application_error(-20000,lSQLCode||', Mesg:'||lSQLErrm||', in sql:'||strSQL,TRUE);
end;
rowprocessed:=dbms_sql.execute(a_cursor);
dbms_sql.close_cursor(a_cursor);
end if;
close crs_check;
end loop;
end;
/
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем здесь собака порылась? / 7 сообщений из 7, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]