Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Как скомпилить процедуру  [new]
serg4321
Member

Откуда: Санкт-Петербург
Сообщений: 133
Всем привет!

Кто-нибудь знает как справиться с такой ситуацией?

У меня есть процедрура, допустим А, которая вызывает процедуру В, которая в свою очередь опять вызывает А. Т.е. получается что-то вроде замкнутого круга, но точка выхода есть (проверяли технологию на MS SqlServer).
Я никак не могу скопмилировать процедуру A, по моему мнению из-за такой вот связки. Вылетает ошибка
ORA-04020: deadlock detected while trying to lock object DBO.CORE_98548F74_SELF_UPDATE

A - это DBO.CORE_98548F74_SELF_RECALC
B - DBO.CORE_98548F74_SELF_UPDATE

Вот трейс на всякий случай
=====================
PARSING IN CURSOR #6 len=50 dep=2 uid=0 oct=3 lid=0 tim=3484224013 hv=1340018025 ad='3e11d54c'
select param, value from settings$ where obj# = :1
END OF STMT
PARSE #6:c=0,e=48,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=3484224009
BINDS #6:
 bind 0: dty=2 mxl=22(22) mal=00 scl=00 pre=00 oacflg=00 oacfl2=1 size=24 offset=0
   bfp=05b6c328 bln=22 avl=04 flg=05
   value=52219
EXEC #6:c=0,e=126,p=0,cr=0,cu=0,mis=0,r=0,dep=2,og=4,tim=3484224257
FETCH #6:c=0,e=35,p=0,cr=3,cu=0,mis=0,r=1,dep=2,og=4,tim=3484224321
FETCH #6:c=0,e=11,p=0,cr=2,cu=0,mis=0,r=1,dep=2,og=4,tim=3484224379
FETCH #6:c=0,e=9,p=0,cr=1,cu=0,mis=0,r=0,dep=2,og=4,tim=3484224426
STAT #6 id=1 cnt=2 pid=0 pos=1 obj=78 op='TABLE ACCESS BY INDEX ROWID SETTINGS$ '
STAT #6 id=2 cnt=2 pid=1 pos=1 obj=126 op='INDEX RANGE SCAN I_SETTINGS1 '
WAIT #3: nam='library cache lock' ela= 2995702 p1=1384976452 p2=1036414152 p3=301
WAIT #3: nam='library cache lock' ela= 2984910 p1=1384976452 p2=1036414152 p3=301
A deadlock among DDL and parse locks is detected.
This deadlock is usually due to user errors in
the design of an application or from issuing a set
of concurrent statements which can cause a deadlock.
This should not be reported to Oracle Support.
The following information may aid in finding
the errors which cause the deadlock:
ORA-04020: deadlock detected while trying to lock object DBO.CORE_98548F74_SELF_RECALC
--------------------------------------------------------
  object   waiting  waiting       blocking blocking
  handle   session     lock mode   session     lock mode
--------  -------- -------- ----  -------- -------- ----
528D1044  3CA8838C 3DC66CC8    X  3CA8838C 3DBB1524    X
--------------------------------------------------------
---------- DUMP OF WAITING AND BLOCKING LOCKS ----------
--------------------------------------------------------
------------- WAITING LOCK -------------
----------------------------------------
SO: 3DC66CC8, type: 51, owner: 3D41DFB4, flag: INIT/-/-/0x00
LIBRARY OBJECT LOCK: lock=3dc66cc8 handle=528d1044 request=X
call pin=00000000 session pin=00000000
htl=3DC66D04[3DBB1560,3DCD1D80] htb=3DCD1D80
user=3ca8838c session=3ca8124c count=0 flags=[00] savepoint=24568
LIBRARY OBJECT HANDLE: handle=528d1044
name=DBO.CORE_98548F74_SELF_RECALC 
hash=ffd8237a timestamp=09-28-2006 15:29:08 previous=09-28-2006 15:20:36
namespace=TABL/PRCD/TYPE flags=KGHP/TIM/PTM/SML/[02000000]
kkkk-dddd-llll=0000-00bf-00bf lock=X pin=X latch#=2
lwt=528D105C[3DC66CD8,3DC66CD8] ltm=528D1064[528D1064,528D1064]
pwt=528D1074[528D1074,528D1074] ptm=528D10CC[528D10CC,528D10CC]
ref=528D104C[528D104C, 528D104C] lnd=528D10D8[3D60D1B4,47961DBC]
  LOCK OWNERS:
      lock     user  session count mode flags
  -------- -------- -------- ----- ---- ------------------------
  3dbb1524 3ca8838c 3ca8838c     1 X   [00]
  LOCK WAITERS:
      lock     user  session count mode
  -------- -------- -------- ----- ----
  3dc66cc8 3ca8838c 3ca8124c     0 X
  PIN OWNERS:
       pin     user  session     lock count mode mask
  -------- -------- -------- -------- ----- ---- ----
  3dc674f0 3ca8838c 3ca8838c        0     1 X    00bf
  LIBRARY OBJECT: object=489d4928
  type=FNCT flags=EXS/LOC/BCM/ALT[0025] pflags=NST/DBG [103] status=INVL load=0
  DEPENDENCIES: count=6 size=16
  ACCESSES: count=4 size=16
  TRANSLATIONS: count=2 size=16
  PARAMETERS are used
  DATA BLOCKS:
  data#     heap  pointer status pins change
  ----- -------- -------- ------ ---- ------
      0 489d4b30 489d49b0 I/P/A     0 NONE  
      1  5b3c730  5d343a4 PGA       1 NONE  
      2 49be206c 54226eac I/P/A     1 NONE  
      3 49be20d0        0 -/P/-     1 NONE  
      4 49be2134        0 I/P/-     1 NONE  
      5  5b3e908        0 PGA       1 NONE  
      7  5b3e8ac  5d30070 PGA       1 NONE  
------------- BLOCKING LOCK ------------
----------------------------------------
SO: 3DBB1524, type: 51, owner: 3D4403AC, flag: INIT/-/-/0x00
LIBRARY OBJECT LOCK: lock=3dbb1524 handle=528d1044 mode=X
call pin=00000000 session pin=00000000
htl=3DBB1560[3DCD1D80,3DC66D04] htb=3DCD1D80
user=3ca8838c session=3ca8838c count=1 flags=[00] savepoint=20789
LIBRARY OBJECT HANDLE: handle=528d1044
name=DBO.CORE_98548F74_SELF_RECALC 
hash=ffd8237a timestamp=09-28-2006 15:29:08 previous=09-28-2006 15:20:36
namespace=TABL/PRCD/TYPE flags=KGHP/TIM/PTM/SML/[02000000]
kkkk-dddd-llll=0000-00bf-00bf lock=X pin=X latch#=2
lwt=528D105C[3DC66CD8,3DC66CD8] ltm=528D1064[528D1064,528D1064]
pwt=528D1074[528D1074,528D1074] ptm=528D10CC[528D10CC,528D10CC]
ref=528D104C[528D104C, 528D104C] lnd=528D10D8[3D60D1B4,47961DBC]
  LOCK OWNERS:
      lock     user  session count mode flags
  -------- -------- -------- ----- ---- ------------------------
  3dbb1524 3ca8838c 3ca8838c     1 X   [00]
  LOCK WAITERS:
      lock     user  session count mode
  -------- -------- -------- ----- ----
  3dc66cc8 3ca8838c 3ca8124c     0 X
  PIN OWNERS:
       pin     user  session     lock count mode mask
  -------- -------- -------- -------- ----- ---- ----
  3dc674f0 3ca8838c 3ca8838c        0     1 X    00bf
  LIBRARY OBJECT: object=489d4928
  type=FNCT flags=EXS/LOC/BCM/ALT[0025] pflags=NST/DBG [103] status=INVL load=0
  DEPENDENCIES: count=6 size=16
  ACCESSES: count=4 size=16
  TRANSLATIONS: count=2 size=16
  PARAMETERS are used
  DATA BLOCKS:
  data#     heap  pointer status pins change
  ----- -------- -------- ------ ---- ------
      0 489d4b30 489d49b0 I/P/A     0 NONE  
      1  5b3c730  5d343a4 PGA       1 NONE  
      2 49be206c 54226eac I/P/A     1 NONE  
      3 49be20d0        0 -/P/-     1 NONE  
      4 49be2134        0 I/P/-     1 NONE  
      5  5b3e908        0 PGA       1 NONE  
      7  5b3e8ac  5d30070 PGA       1 NONE  
--------------------------------------------------------
This lock request was aborted.
EXEC #3:c=203125,e=6194544,p=0,cr=24,cu=0,mis=0,r=0,dep=1,og=4,tim=3490376849
ERROR #3:err=4020 tim=48435934
EXEC #1:c=250000,e=6241638,p=0,cr=258,cu=0,mis=0,r=0,dep=0,og=4,tim=3490379576
ERROR #1:err=4020 tim=48435934
WAIT #1: nam='SQL*Net break/reset to client' ela= 3 p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net break/reset to client' ela= 347 p1=1413697536 p2=0 p3=0
WAIT #1: nam='SQL*Net message to client' ela= 2 p1=1413697536 p2=1 p3=0
WAIT #1: nam='SQL*Net message from client' ela= 82712 p1=1413697536 p2=1 p3=0

Изменять технологию очень не хотелось бы.
Заранее спасибо!
28 сен 06, 16:07    [3197723]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Vasiliy Utkin
Member

Откуда: Rostov
Сообщений: 47
А сделать временно вместо процедуры B пустушку с тем-же определением что и оригинал, и после компиляции A снова вернуть нормальный код B и скомпилить ее?
28 сен 06, 16:11    [3197751]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Chik
Member

Откуда: Kharkov
Сообщений: 5
А можно тексты процедур сюда выложить?
Ну или хотя бы куски из них где бы .skj видно как они вызываются?
28 сен 06, 16:11    [3197760]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
Не понял.
DBO.CORE_98548F74_SELF_RECALC - это процедура в пакете DBO ?
28 сен 06, 16:13    [3197765]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
serg4321
Member

Откуда: Санкт-Петербург
Сообщений: 133
Если я перекомпилю B после вставки в нее нормального кода, то А снова станет INVALID и все сначала...
28 сен 06, 16:13    [3197766]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
serg4321
Member

Откуда: Санкт-Петербург
Сообщений: 133
нет DBO - это пользователь
28 сен 06, 16:16    [3197781]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Q u a d r o
Member

Откуда: Canada
Сообщений: 1987
serg4321
проверяли технологию на MS SqlServer

Oracle отличен от SQL Server как день от ночи. Вам лучше забыть всё что вы делали на SQL Server и "сменить технологию" - иначе в будущем вас ждут гораздо более серъёзные грабли - можете в этом быть уверены.

И эти имена процедур.... вы генерируете процедуры на лету?

serg4321
Если я перекомпилю B после вставки в нее нормального кода, то А снова станет INVALID и все сначала...

Это механизм зависимостей внутри СУБД (сюрприз - просто не существует в SQL Server, а так же вас скоро ждёт ещё пара сотен вещей :)

Вы можете использовать динамический SQL - но я бы не стал это делать (решение может оказаться хуже проблемы которую вы пытаетесь решить).
28 сен 06, 16:16    [3197786]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
tru55
Member

Откуда: СПб
Сообщений: 19790
попробуй запихнуть их в пакет, там спецификация пакета используется как forwarding declaration
28 сен 06, 16:18    [3197800]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Elic
Member

Откуда:
Сообщений: 29990
serg4321
У меня есть процедрура, допустим А, которая вызывает процедуру В, которая в свою очередь опять вызывает А. Т.е. получается что-то вроде замкнутого круга, но точка выхода есть
Циклических зависимостей между разными объектами быть не может. Но впределах одного объекта (пакета) - можно.

serg4321
(проверяли технологию на MS SqlServer).
На здоровье
28 сен 06, 16:19    [3197808]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
serg4321
Member

Откуда: Санкт-Петербург
Сообщений: 133
Elic
serg4321
У меня есть процедрура, допустим А, которая вызывает процедуру В, которая в свою очередь опять вызывает А. Т.е. получается что-то вроде замкнутого круга, но точка выхода есть
Циклических зависимостей между разными объектами быть не может. Но впределах одного объекта (пакета) - можно.

serg4321
(проверяли технологию на MS SqlServer).
На здоровье


Я имел ввиду что на MS это все уже работает и теперь надо перевести на Oracle
28 сен 06, 16:25    [3197861]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Вячеслав Любомудров
Member

Откуда: Владивосток
Сообщений: 18486
Elic
serg4321
У меня есть процедрура, допустим А, которая вызывает процедуру В, которая в свою очередь опять вызывает А. Т.е. получается что-то вроде замкнутого круга, но точка выхода есть
Циклических зависимостей между разными объектами быть не может. Но впределах одного объекта (пакета) - можно.
Чет я не понял этой фразы

А решение уже подсказали -- использовать пакеты
tst> create package pkg1 as
  2  procedure a(i number);
  3  end;
  4  /

Package created.

tst> create package pkg2 as
  2  procedure b(i number);end;
  3  /

Package created.

tst> create package body pkg1 as
  2  procedure a(i number) is
  3  begin
  4      if i > 0 then
  5          pkg2.b(i-1);
  6      end if;
  7      return;
  8  end;
  9  end;
 10  /

Package body created.

tst> create package body pkg2 as
  2  procedure b(i number) is
  3  begin
  4      if i > 0 then
  5          pkg1.a(i-1);
  6      end if;
  7      return;
  8  end;
  9  end;
 10  /

Package body created.

tst> exec pkg1.a(10)

PL/SQL procedure successfully completed.
29 сен 06, 01:55    [3199555]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Elic
Member

Откуда:
Сообщений: 29990
Вячеслав Любомудров
Elic
Циклических зависимостей между разными объектами быть не может. Но впределах одного объекта (пакета) - можно.
Чет я не понял этой фразы
Первой или второй? :)

Вячеслав Любомудров
А решение уже подсказали -- использовать пакеты
tst> create package pkg1 as
tst> create package pkg2 as
tst> create package body pkg1 as
tst> create package body pkg2 as
Ну так четыре объекта и никаких циклических связей.
29 сен 06, 09:04    [3199863]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
serg4321
Member

Откуда: Санкт-Петербург
Сообщений: 133
Всем спасибо, сделаю с пакетами
29 сен 06, 17:09    [3204097]     Ответить | Цитировать Сообщить модератору
 Re: Как скомпилить процедуру  [new]
Anton Demidov
Member

Откуда: Atlanta, GA
Сообщений: 1187
А может всё в один пакет соберёте?

--
Антон
Per rectum ad astrum
29 сен 06, 20:44    [3204926]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить