DBA Data[Home] [Help]

PACKAGE BODY: APPS.AD_LOCK_UTILS_PKG

Source


1 PACKAGE BODY Ad_Lock_Utils_Pkg AS
2 -- $Header: adlckutlb.pls 115.3 2004/09/17 07:38:49 msailoz noship $
3 
4   g_LockName    varchar2(128);
5   g_LockHandle  varchar2(128);
6 
7   PDML_LOCK_NAME CONSTANT VARCHAR2(30) := 'AD_PARALLEL';
8 
9   --
10   -- Procedure Allocate_Handle
11   --
12   --     Allocates lockhandle for a given lock
13   --
14   --     This is defined as an autonomous transaction as DBMS_LOCK.Allocate_Unique does an implicit
15   --     commit
16   --
17   PROCEDURE Allocate_Handle(
18              p_LockName          IN  VARCHAR2 ,
19              x_LockHandle         OUT NOCOPY VARCHAR2 )
20   IS
21     PRAGMA AUTONOMOUS_TRANSACTION ;
22     l_LockHandle    VARCHAR2(128);
23   BEGIN
24       DBMS_LOCK.ALLOCATE_UNIQUE(
25                   lockname   => p_LockName,
26                   lockhandle => l_LockHandle);
27       x_LockHandle := l_LockHandle;
28 
29       COMMIT ;
30   END Allocate_Handle ;
31 
32   PROCEDURE Get_Lock(
33               p_LockName          IN  VARCHAR2 ,
34               p_LockMode          IN  VARCHAR2 ,
35 	      p_Release_On_Commit IN  BOOLEAN,
36 	      x_LockHandle        IN OUT NOCOPY VARCHAR2 )
37   IS
38     l_reqid  number;
39   BEGIN
40 
41      IF (g_LockName = p_LockName) THEN
42        x_LockHandle := g_LockHandle;
43      ELSE
44         Allocate_Handle(p_LockName, x_LockHandle);
45         g_LockHandle := x_LockHandle;
46         g_LockName := p_LockName;
47      END IF;
48 
49      l_reqid := dbms_lock.request(lockhandle=>x_LockHandle,
50                                   lockmode=>p_LockMode,
51                                   timeout=>dbms_lock.maxwait,
52                                   release_on_commit=>p_Release_On_Commit);
53 
54      IF (l_reqid <> 0) THEN
55         raise_application_error(-20001,
56             'dbms_lock.request('|| g_LockHandle ||
57             ', ' || p_LockMode ||
58             ', ' || dbms_lock.maxwait ||
59             ') returned : ' || l_reqid);
60      END IF;
61   END;
62 
63   PROCEDURE Get_Lock(
64               p_LockName          IN  VARCHAR2 ,
65               p_LockMode          IN  VARCHAR2 ,
66 	      p_Release_On_Commit IN  BOOLEAN)
67   IS
68     l_LockHandle varchar2(128);
69   BEGIN
70 
71     l_LockHandle := NULL;
72 
73     ad_lock_utils_pkg.Get_Lock(
74               p_LockName=>p_LockName,
75               p_LockMode=>p_LockMode,
76               p_Release_On_Commit=>p_Release_On_Commit,
77               x_LockHandle=>l_LockHandle);
78   END;
79 
80   PROCEDURE Release_Lock(
81               p_LockHandle IN VARCHAR2 )
82   IS
83     l_LockStatus number;
84   BEGIN
85 
86     l_LockStatus := DBMS_LOCK.RELEASE(
87                         lockhandle => p_LockHandle);
88 
89     IF (l_LockStatus <> 0) THEN
90       raise_application_error(-20001, 'DBMS_LOCK.release() returned '||l_LockStatus);
91     END IF;
92   END;
93 
94   PROCEDURE Release_Lock(p_LockName  IN  VARCHAR2)
95   IS
96     l_LockHandle varchar2(128);
97   BEGIN
98 
99      IF (g_LockName = p_LockName) THEN
100        l_LockHandle := g_LockHandle;
101      ELSE
102         Allocate_Handle(p_LockName, l_LockHandle);
103         g_LockHandle := l_LockHandle;
104         g_LockName := p_LockName;
105      END IF;
106 
107      Release_Lock(p_LockHandle=>l_LockHandle);
108   END;
109 
110   PROCEDURE Acquire_PDML_Lock
111   IS
112   BEGIN
113       Get_Lock(p_LockName=>PDML_LOCK_NAME,
114                p_LockMode=>DBMS_LOCK.X_MODE,
115                p_Release_On_Commit=>FALSE);
116   END;
117 
118   PROCEDURE Release_PDML_Lock
119   IS
120   BEGIN
121      Release_Lock( p_LockName=>PDML_LOCK_NAME);
122 
123   END;
124 
125 BEGIN
126   g_LockName   := '##UNKNOWN##';
127   g_LockHandle := '##UNKNOWN##';
128 END Ad_Lock_Utils_Pkg;