DBA Data[Home] [Help]

PACKAGE BODY: APPS.PSB_MESSAGE_S

Source


1 PACKAGE BODY PSB_MESSAGE_S AS
2 /* $Header: PSBSTMSB.pls 120.3 2004/12/06 17:35:45 viraghun ship $ */
3 
4  l_new_line_char VARCHAR2(2000) := FND_GLOBAL.Newline;
5 
6  FUNCTION    Get ( p_msg_index     IN NUMBER   ,
7 		   p_encoded       IN VARCHAR2 := FND_API.G_TRUE )
8  RETURN VARCHAR2 IS
9 
10  l_msg_buf VARCHAR2(2000) ;
11 
12  BEGIN
13 
14   l_msg_buf := FND_MSG_PUB.Get(p_msg_index,
15 			       p_encoded);
16 
17   return l_msg_buf ;
18 
19  END Get ;
20 
21  FUNCTION SUBSTRB_GET RETURN VARCHAR2 IS
22 
23  l_msg_buf VARCHAR2(2000) ;
24 
25  BEGIN
26 
27   l_msg_buf := SUBSTRB(FND_MESSAGE.Get, 1, 255);
28 
29   return l_msg_buf ;
30 
31  END ;
32 
33  FUNCTION SUBSTRB_GET (p_msg_index      IN NUMBER,
34 		       p_encoded        IN VARCHAR2)
35  RETURN VARCHAR2 IS
36 
37  l_msg_buf VARCHAR2(2000);
38 
39  BEGIN
40 
41    l_msg_buf := substrb(FND_MSG_PUB.Get (p_msg_index    => p_msg_index,
42 					 p_encoded      => p_encoded), 1, 255);
43 
44    return l_msg_buf ;
45 
46  END ;
47 
48 
49 
50  PROCEDURE  Print_Error ( p_mode         IN VARCHAR2,
51 			  p_print_header IN VARCHAR2 := FND_API.G_TRUE )
52  IS
53 
54   l_msg_count   NUMBER         ;
55   l_msg_data    VARCHAR2(2000) ;
56   l_msg_buf     VARCHAR2(2000) ;
57 
58   BEGIN
59 
60     -- Validate the p_mode parameter.
61     IF p_mode NOT IN (FND_FILE.LOG, FND_FILE.OUTPUT) THEN
62       --
63       Fnd_Message.Set_Name ('PSB', 'PSB_INVALID_ARGUMENT') ;
64       Fnd_Message.Set_Token('ROUTINE', 'Print_Error' ) ;
65       l_msg_buf := Fnd_Message.Get ;
66       FND_FILE.Put_Line( FND_FILE.LOG, l_msg_buf ) ;
67       RETURN ;
68       --
69     END IF ;
70 
71     -- Get number of messages to print.
72     FND_MSG_PUB.Count_And_Get ( p_count => l_msg_count ,
73                                 p_data  => l_msg_data  ) ;
74 
75     -- If no messages to print, simply return (bug#3190892).
76     IF l_msg_count = 0 THEN
77       RETURN ;
78     ELSE
79       -- Print standard header is asked for.
80       IF FND_API.to_Boolean( p_print_header ) THEN
81         FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_FAILURE_HEADER');
82         l_msg_buf  := substrb_get ;
83         FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
84       END IF ;
85       --
86 
87       /* No longer applicable.
88       if l_msg_count = 0 then
89         FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
90         l_msg_buf  := substrb_get ;
91         FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
92       */
93 
94       IF l_msg_count = 1 then
95 
96         FND_MESSAGE.Set_Encoded(l_msg_data);
97         l_msg_buf := substrb_get ;
98         FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
99 
100       ELSIF l_msg_count > 1 then
101 
102         -- Get all messages from the message stack.
103         FOR i IN 1..l_msg_count
104         LOOP
105           --
106           IF i = 1 THEN
107             l_msg_buf := substrb_get
108 	                 ( p_msg_index => FND_MSG_PUB.G_FIRST,
109 	                   p_encoded   => FND_API.G_FALSE    ) ;
110           ELSE
111             l_msg_buf := substrb_get
112                          ( p_msg_index    => FND_MSG_PUB.G_NEXT,
113                            p_encoded      => FND_API.G_FALSE   ) ;
114           END IF;
115           --
116           FND_FILE.Put_Line( p_mode, l_msg_buf ) ;
117           --
118         END LOOP ;
119         -- End getting all messages from the message stack.
120 
121       END IF;
122 
123     END IF ;
124 
125  END Print_Error ;
126 
127 
128  PROCEDURE  Insert_Error( p_source_process IN VARCHAR2,
129 			  p_process_id     IN NUMBER,
130 			  p_msg_count      IN NUMBER,
131 			  p_msg_data       IN VARCHAR2,
132 			  p_desc_sequence  IN VARCHAR2 := FND_API.G_FALSE
133 			)
134  IS
135 
136 
137   l_msg_count   NUMBER          := p_msg_count ;
138   l_msg_data    VARCHAR2(2000)  := p_msg_data ;
139   l_msg_buf     VARCHAR2(2000) ;
140   l_conc_req_id NUMBER          := NVL(FND_GLOBAL.CONC_REQUEST_ID, FND_API.G_MISS_NUM);
141   l_user_id     NUMBER          := FND_GLOBAL.USER_ID ;
142   l_seq_number  NUMBER          := 0 ;
143 
144   BEGIN
145 
146     if FND_API.to_Boolean( p_desc_sequence ) then
147 	l_seq_number := l_msg_count + 1 ;
148     end if;
149 
150     if l_msg_count = 1 then
151 	FND_MESSAGE.Set_Encoded(l_msg_data);
152 	l_msg_buf := FND_MESSAGE.Get;
153     elsif l_msg_count = 0 then
154 	FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
155 	l_msg_buf  := FND_MESSAGE.Get ;
156     elsif l_msg_count > 1 then
157 	for i in 1..l_msg_count loop
158 
159 	    if i =1 then
160 	       l_msg_buf := FND_MSG_PUB.Get
161 				(p_msg_index    => FND_MSG_PUB.G_FIRST,
162 				 p_encoded      => FND_API.G_FALSE);
163 	    else
164 	       l_msg_buf := FND_MSG_PUB.Get
165 				(p_msg_index    => FND_MSG_PUB.G_NEXT,
166 				 p_encoded      => FND_API.G_FALSE);
167 	    end if;
168 
169 	    if FND_API.to_Boolean( p_desc_sequence ) then
170 	       l_seq_number := l_seq_number - 1 ;
171 	    else
172 	       l_seq_number := i ;
173 	    end if ;
174 
175 	    insert into PSB_ERROR_MESSAGES
176 		       (concurrent_request_id,
177 			process_id,
178 			source_process,
179 			sequence_number,
180 			description,
181 			creation_date,
182 			created_by)
183 		values (l_conc_req_id,
184 			p_process_id,
185 			p_source_process,
186 			l_seq_number,
187 			l_msg_buf,
188 			sysdate,
189 			l_user_id);
190 	end loop ;
191     end if;
192 
193     if l_msg_count = 0 or l_msg_count = 1 then
194 	insert into PSB_ERROR_MESSAGES
195 		       (concurrent_request_id,
196 			process_id,
197 			source_process,
198 			sequence_number,
199 			description,
200 			creation_date,
201 			created_by)
202 		values (l_conc_req_id,
203 			p_process_id,
204 			p_source_process,
205 			1,
206 			l_msg_buf,
207 			sysdate,
208 			l_user_id);
209     end if;
210 
211  END Insert_Error ;
212 
213 
214 
215  PROCEDURE  Print_Success IS
216 
217   l_msg_buf     VARCHAR2(2000) ;
218 
219   BEGIN
220 
221     FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_SUCCESS');
222     l_msg_buf  := substrb_get;
223     FND_FILE.Put_Line( FND_FILE.OUTPUT, l_msg_buf );
224 
225  END Print_Success ;
226 
227 
228  PROCEDURE  Get_Error_Message( p_print_header IN VARCHAR2 := FND_API.G_TRUE,
229 			       p_msg_string   OUT  NOCOPY VARCHAR2)
230  IS
231   --
232   l_msg_count      NUMBER         ;
233   l_msg_data       VARCHAR2(2000) ;
234   l_msg_buf        VARCHAR2(2000) ;
235   --
236  BEGIN
237 
238     if FND_API.to_Boolean( p_print_header ) then
239        -- Standard program failure message.
240        FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_FAILURE_HEADER');
241        l_msg_buf := substrb_get;
242     end if;
243 
244     -- Count total number of messages.
245     FND_MSG_PUB.Count_And_Get(  p_count  => l_msg_count,
246 				p_data   => l_msg_data   );
247 
248     if l_msg_count = 1 then
249 	--
250 	FND_MESSAGE.Set_Encoded(l_msg_data);
251 	l_msg_buf := l_msg_buf || l_new_line_char || substrb_get ;
252 	--
253     elsif l_msg_count > 1 then
254 	--
255 	for i in 1..l_msg_count loop
256 
257 	    if i = 1 then
258 		l_msg_buf := l_msg_buf || l_new_line_char ||
259 			     substrb_get
260 				(  p_msg_index    => FND_MSG_PUB.G_FIRST,
261 				   p_encoded      => FND_API.G_FALSE
262 				);
263 	    else
264 		l_msg_buf := l_msg_buf || l_new_line_char ||
265 			     substrb_get
266 				(  p_msg_index    => FND_MSG_PUB.G_NEXT,
267 				   p_encoded      => FND_API.G_FALSE
268 				);
269 	    end if;
270 	end loop ;
271     elsif l_msg_count = 0 then
272 	--
273 	FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
274 	l_msg_buf := l_msg_buf || l_new_line_char || substrb_get ;
275 	--
276     end if;
277 
278     p_msg_string := l_msg_buf ;
279 
280  END Get_Error_Message ;
281 
282 
283  PROCEDURE  Get_Success_Message( p_msg_string OUT  NOCOPY VARCHAR2 )
284  IS
285  BEGIN
286     --
287     FND_MESSAGE.Set_Name('PSB', 'PSB_PROGRAM_SUCCESS');
288     p_msg_string  := substrb_get ;
289     --
290  END ;
291 
292 
293   FUNCTION  Get_Error_Stack ( p_msg_count NUMBER )
294   RETURN VARCHAR2
295   IS
296 
297     l_msg_count               NUMBER ;
298     l_msg_data                VARCHAR2(2000) ;
299 
300     -- The error stack in workflow supports VARCHAR2(4000).
301     -- Setting it to 3900 to leave space for function and procedure names.
302     l_error_message           VARCHAR2(3900) := null ;
303 
304   BEGIN
305 
306     -- Check if messages exist or not.
307     IF p_msg_count IS NULL THEN
308       RETURN NULL ;
309     END IF;
310 
311     -- Retrieve messages from the message stack.
312     FOR i IN 1..p_msg_count
313     LOOP
314       FND_MSG_PUB.Get( p_msg_index     => i  ,
315 		       p_encoded       => FND_API.G_FALSE     ,
316 		       p_data          => l_msg_data          ,
317 		       p_msg_index_out => l_msg_count
318 		   );
319 
320       l_error_message := l_error_message || ' ' || l_msg_data ;
321 
322     END LOOP;
323 
324     RETURN l_error_message ;
325 
326   EXCEPTION
327     WHEN value_error THEN
328 
329       -- The probability of crossing limit of 3900 char is very low. Checking
330       -- for length for each message is inefficient. This code path should give
331       -- faster performance.
332       RETURN l_error_message ;
333 
334     WHEN others THEN
335       RAISE ;
336   END Get_Error_Stack ;
337 
338 /* Start bug no  4030864 */
339 
340 PROCEDURE BATCH_INSERT_ERROR (p_source_process IN VARCHAR2,
341                           p_process_id     IN NUMBER)
342 IS
343   l_msg_count    NUMBER;
344   l_msg_data     VARCHAR2(3000);
345   l_msg_buf      VARCHAR2(3000);
346   l_max_seq_no   NUMBER;
347   l_seq_no       NUMBER;
348   l_loop_process BOOLEAN;
349   l_conc_req_id  NUMBER  := NVL(FND_GLOBAL.CONC_REQUEST_ID, FND_API.G_MISS_NUM);
350   l_user_id      NUMBER  := FND_GLOBAL.USER_ID ;
351 
352   -- cursor to fetch the maximum of sequence
353   CURSOR l_seq_csr
354   IS
355   SELECT max(sequence_number) seq_no
356   FROM   psb_error_messages
357   WHERE  process_id = p_process_id
358   AND    source_process = p_source_process;
359 
360 BEGIN
361   -- get the maximum sequence number
362   FOR l_seq_rec IN l_seq_csr
363   LOOP
364     l_max_seq_no :=  NVL(l_seq_rec.seq_no,0);
365   END LOOP;
366 
367   fnd_msg_pub.count_and_get(
368     p_count => l_msg_count,
369     p_data => l_msg_data);
370 
371   l_loop_process := FALSE;
372 
373   FOR l_count IN 1..l_msg_count
374   LOOP
375     l_loop_process := TRUE;
376     l_seq_no := l_max_seq_no + l_count;
377 
378     if l_count =1 then
379       if l_count = l_msg_count then
380         fnd_message.Set_Encoded(l_msg_data);
381         l_msg_buf := FND_MESSAGE.Get;
382       else
383         l_msg_buf := FND_MSG_PUB.Get
384 			 (p_msg_index    => FND_MSG_PUB.G_FIRST,
385 			  p_encoded      => FND_API.G_FALSE);
386       end if;
387     else
388       l_msg_buf := FND_MSG_PUB.Get
389 	            (p_msg_index    => FND_MSG_PUB.G_NEXT,
390 		     p_encoded      => FND_API.G_FALSE);
391     end if;
392 
393      insert into PSB_ERROR_MESSAGES
394      (concurrent_request_id,
395       process_id,
396       source_process,
397       sequence_number,
398       description,
399       creation_date,
400       created_by
401       )
402       values
403      (
404       l_conc_req_id,
405       p_process_id,
406       p_source_process,
407       l_seq_no,
408       l_msg_buf,
409       sysdate,
410       l_user_id
411       );
412 
413   END LOOP;
414 
415   IF l_loop_process = FALSE then
416     FND_MESSAGE.Set_Name('PSB', 'PSB_SERVER_ERROR_NO_MSG');
417     l_msg_buf  := FND_MESSAGE.Get ;
418 
419     insert into PSB_ERROR_MESSAGES
420     (concurrent_request_id,
421      process_id,
422      source_process,
423      sequence_number,
424      description,
425      creation_date,
426      created_by)
427      values
428      (l_conc_req_id,
429       p_process_id,
430       p_source_process,
431       1,
432       l_msg_buf,
433       sysdate,
434       l_user_id);
435 
436   end if;
437 
438 END;
439 /* End bug no  4030864 */
440 
441 
442 END PSB_MESSAGE_S;