powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем здесь собака порылась?
7 сообщений из 7, страница 1 из 1
В чем здесь собака порылась?
    #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
В чем здесь собака порылась?
    #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
В чем здесь собака порылась?
    #32168501
Фотография softy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Т.е. отдельные обьекты так и остаются Invalid"


У тебя обьекты наверняка взаимосвязаны. Например есть два вью. Второй вью основан на первом. Если первый вью инвалидный, то и второй тоже будет инвалидный. Я твой код не изучал, поэтому спрашиваю - у тебя соблюдается порядок перекомпиляции? Если нет, то можно до бесконечности эту процедуру запускать - если ты сначала компилишь второй вью, а потом первый.
...
Рейтинг: 0 / 0
В чем здесь собака порылась?
    #32168508
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Постойте а где
DBMS_SQL.EXECUTE ?
...
Рейтинг: 0 / 0
В чем здесь собака порылась?
    #32168511
Фотография Eter Panji
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще здесь от DBMS_SQL выигрыша никакого нет
Лучше EXECUTE IMMEDIATE
...
Рейтинг: 0 / 0
В чем здесь собака порылась?
    #32168517
Serge_kz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если тебе надо перекомпилить все invalid объекты определённой схемы то делай вот так
dbms_utility.compile_schema('schema1', False);
...
Рейтинг: 0 / 0
В чем здесь собака порылась?
    #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
7 сообщений из 7, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / В чем здесь собака порылась?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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