[Home] [Help]
PACKAGE BODY: APPS.FND_TRANSACTION
Source
1 package body fnd_transaction as
2 /* $Header: AFCPTRNB.pls 120.9 2006/05/26 21:29:34 ckclark ship $ */
3
4
5 --
6 -- Private Variables
7 --
8 sid number := null;
9 send_type varchar2(1);
10 request_id number := -1;
11 g_program_appl_id number;
12 g_program_id number;
13 action_cnt number := 1;
14 p_transport_type varchar2(32) := 'QUEUE';
15 token_timeout number;
16 temp_fcp_application_id number;
17 temp_fcp_concurrent_program_id number;
18
19
20
21
22 --
23 -- debug_info
24 -- Purpose
25 -- If the debug flag is set, then write to
26 -- the debug table.
27 -- Arguments
28 -- IN:
29 -- function_name - Name of the calling function
30 -- action_name - Name of the current action being logged
31 -- message_text - Any relevent info.
32 -- s_type - Source Type ('C'- Client Send, 'M' - Manager Receive
33 -- 'S' - Server Send, 'U' - Client Receive)
34 -- Notes
35 -- none.
36 --
37 procedure debug_info(function_name in varchar2,
38 action_name in varchar2,
39 message_text in varchar2,
40 s_type in varchar2 default 'C') is
41 PRAGMA AUTONOMOUS_TRANSACTION;
42 begin
43
44 insert into fnd_concurrent_debug_info
45 (
46 session_id, user_id, login_id,
47 time, function, action, message,
48 resp_appl_id, responsibility_id,
49 security_group_id, transaction_id,
50 program_application_id, concurrent_program_id,
51 concurrent_queue_id, time_in_number, source_type
52 )
53 values
54 (
55 sid, fnd_global.user_id, fnd_global.login_id,
56 sysdate, function_name, substr(action_cnt || '|' || action_name, 1, 30),
57 substr(message_text, 1, ARGMAX),
58 fnd_global.resp_appl_id, fnd_global.resp_id,
59 fnd_global.security_group_id,request_id,
60 g_program_appl_id, g_program_id,
61 conc_queue_id, dbms_utility.get_time, s_type
62 );
63
64 action_cnt := action_cnt + 1;
65
66 commit;
67 end;
68
69
70 --
71 -- post_tm_event
72 -- Purpose
73 -- Posts TM Event into FND_TM_EVENTS table as autonomous transaction
74 -- Arguments
75 -- event_type number
76 procedure post_tm_event( event_type in number,
77 application in varchar2,
78 program in varchar2,
79 queue_id in number,
80 timeout in number default null,
81 tm_pipe in varchar2 default null ) is
82 PRAGMA AUTONOMOUS_TRANSACTION;
83 begin
84 if ( event_type = 1 ) then
85 -- NO MANAGER DEFINED EVENT
86 insert into fnd_tm_events
87 (EVENT_TYPE, TIMESTAMP, TRANSACTION_ID,
88 PROGRAM_APPLICATION_ID, CONCURRENT_PROGRAM_ID,
89 USER_ID, RESP_APPL_ID, RESPONSIBILITY_ID)
90 SELECT event_type, sysdate, request_id,
91 fcp.application_id, fcp.concurrent_program_id,
92 fnd_global.user_id, fnd_global.resp_appl_id, fnd_global.resp_id
93 from fnd_concurrent_programs fcp, fnd_application fa
94 where fcp.concurrent_program_name = program
95 and fcp.application_id = fa.application_id
96 and fa.application_short_name = application;
97 elsif ( event_type = 2 ) then
98 -- MANAGER BUSY EVENT
99 /* mark soft busy event (2) */
100 insert into fnd_tm_events
101 (EVENT_TYPE, TIMESTAMP, TRANSACTION_ID,
102 QUEUE_APPLICATION_ID, CONCURRENT_QUEUE_ID,
103 PROGRAM_APPLICATION_ID, CONCURRENT_PROGRAM_ID,
104 USER_ID, RESP_APPL_ID, RESPONSIBILITY_ID,
105 RUNNING_PROCESSES, TARGET_PROCESSES)
106 SELECT event_type, sysdate, request_id,
107 FCQ.application_id, queue_id,
108 fcp.application_id, fcp.concurrent_program_id,
109 fnd_global.user_id, fnd_global.resp_appl_id, fnd_global.resp_id,
110 fcq.RUNNING_PROCESSES, fcq.max_processes
111 from fnd_concurrent_programs fcp,
112 fnd_concurrent_queues fcq,
113 fnd_application fa
114 where fcp.concurrent_program_name = program
115 and fcq.concurrent_queue_id = queue_id
116 and fcp.application_id = fa.application_id
117 and fa.application_short_name = application;
118
119 elsif ( event_type = 3 ) then
120 -- ALL MANAGERS WERE BUSY EVENT
121 -- delete previously posted soft busy events before posting hard busy
122 -- event.
123 delete from fnd_tm_events
124 where transaction_id = request_id
125 and event_type = 2;
126
127 /* mark all appropriate managers as hard busy events */
128 insert into fnd_tm_events
129 (EVENT_TYPE, TIMESTAMP, TRANSACTION_ID,
130 QUEUE_APPLICATION_ID, CONCURRENT_QUEUE_ID,
131 PROGRAM_APPLICATION_ID, CONCURRENT_PROGRAM_ID,
132 USER_ID, RESP_APPL_ID, RESPONSIBILITY_ID,
133 RUNNING_PROCESSES, TARGET_PROCESSES)
134 SELECT
135 /*+ ORDERED USE_NL (fa fcp fr fcpp fcq)
136 INDEX (fcq,FND_CONCURRENT_QUEUES_N1)
137 INDEX (fcpp,FND_CONC_PROCESSOR_PROGRAMS_U2) */
138 3, sysdate, request_id,
139 FCQ.application_id, FCQ.concurrent_queue_id,
140 fcp.application_id, fcp.concurrent_program_id,
141 fnd_global.user_id, fnd_global.resp_appl_id, fnd_global.resp_id,
142 fcq.RUNNING_PROCESSES, fcq.max_processes
143 from fnd_application fa,
144 fnd_concurrent_programs fcp,
145 fnd_conc_processor_programs fcpp,
146 fnd_responsibility fr,
147 fnd_concurrent_queues fcq
148 where fcp.concurrent_program_name = program
149 and fcq.processor_application_id = fcpp.processor_application_id
150 and fcq.concurrent_processor_id = fcpp.concurrent_processor_id
151 and fcpp.concurrent_program_id = fcp.concurrent_program_id
152 and fcpp.program_application_id = fcp.application_id
153 and fcp.application_id = fa.application_id
154 and fa.application_short_name = application
155 and fr.responsibility_id = fnd_global.resp_id
156 and fr.application_id = fnd_global.resp_appl_id
157 and fr.data_group_id = fcq.data_group_id
158 and fcq.manager_type = '3';
159 elsif ( event_type = 4 ) then
160 /* mark timeout event (4) */
161 if p_transport_type = 'PIPE' then
162 /* bug5007493 - separating sql */
163 SELECT fcp.application_id, fcp.concurrent_program_id
164 into temp_fcp_application_id, temp_fcp_concurrent_program_id
165 from fnd_concurrent_programs fcp
166 where fcp.concurrent_program_name = program
167 and fcp.application_id = (
168 SELECT application_id
169 from fnd_application
170 where application_short_name = application);
171
172 insert into fnd_tm_events
173 (EVENT_TYPE, TIMESTAMP, TRANSACTION_ID,
174 QUEUE_APPLICATION_ID, CONCURRENT_QUEUE_ID,
175 PROGRAM_APPLICATION_ID, CONCURRENT_PROGRAM_ID,
176 USER_ID, RESP_APPL_ID, RESPONSIBILITY_ID,
177 RUNNING_PROCESSES, TARGET_PROCESSES, NUMDATA)
178 SELECT 4, sysdate, request_id,
179 FCQ.application_id, fcq.concurrent_queue_id,
180 temp_fcp_application_id, temp_fcp_concurrent_program_id,
181 fnd_global.user_id, fnd_global.resp_appl_id, fnd_global.resp_id,
182 fcq.RUNNING_PROCESSES, fcq.max_processes, timeout
183 from fnd_concurrent_queues fcq
184 where fcq.concurrent_queue_id = to_number(substr(tm_pipe,11));
185 else
186 insert into fnd_tm_events
187 (EVENT_TYPE, TIMESTAMP, TRANSACTION_ID,
188 PROGRAM_APPLICATION_ID, CONCURRENT_PROGRAM_ID,
189 USER_ID, RESP_APPL_ID, RESPONSIBILITY_ID, NUMDATA)
190 SELECT event_type, sysdate, request_id,
191 fcp.application_id, fcp.concurrent_program_id,
192 fnd_global.user_id, fnd_global.resp_appl_id, fnd_global.resp_id, timeout
193 from fnd_concurrent_programs fcp, fnd_application fa
194 where fcp.concurrent_program_name = program
195 and fcp.application_id = fa.application_id
196 and fa.application_short_name = application;
197 end if;
198
199 end if;
200
201 commit;
202 end;
203
204 --
205 -- Private Procedure
206 -- initialize_globals
207 -- Purpose
208 -- Initialize the package globals for
209 -- this session.
210 -- Arguments
211 -- None
212 -- Notes
213 -- None
214 --
215 procedure initialize_globals is
216 conc_debug varchar2(240);
217 begin
218 -- get transaction request_id from sequence
219 select fnd_trn_request_id_s.nextval
220 into request_id
221 from dual;
222
223 /* initialize and seed random... */
224 dbms_random.initialize(request_id);
225
226 --bug 3623063 - init queue_id for session
227 /* initialize conc_queue_id */
228 conc_queue_id := null;
229
230 -- session id
231 if (sid is null) then
232 select userenv('SESSIONID')
233 into sid
234 from sys.dual;
235 end if;
236
237 -- PIPE/QUEUE profile option switch
238 FND_PROFILE.GET('CONC_TM_TRANSPORT_TYPE', p_transport_type);
239 if p_transport_type is null then
240 p_transport_type := 'QUEUE';
241 end if;
242
243 -- debug
244 fnd_profile.get('CONC_DEBUG', conc_debug);
245 if (instr(conc_debug, 'TC') <> 0) then
246 debug_flag := TRUE;
247 end if;
248 if (instr(conc_debug, 'TM1') <> 0) then
249 send_type := TYPE_REQUEST_DEBUG1;
250 elsif (instr(conc_debug, 'TM2') <> 0) then
251 send_type := TYPE_REQUEST_DEBUG2;
252 else
253 send_type := TYPE_REQUEST;
254 end if;
255
256 action_cnt := 1;
257
258 begin
259 fnd_profile.get('CONC_TOKEN_TIMEOUT', token_timeout);
260 if (token_timeout is null) then
261 token_timeout := DEFAULT_TIMEOUT;
262 end if;
263 exception
264 when VALUE_ERROR then
265 token_timeout := DEFAULT_TIMEOUT;
266 end;
267
268 for counter in 1..20 loop
269 return_values(counter) := null;
270 end loop;
271
272 end initialize_globals;
273
274
275
276
277
278 --
279 -- Function
280 -- synchronous
281 -- Purpose
282 -- Submit a synchronous transaction request.
283 -- Arguments
284 -- IN
285 -- timeout - Number of seconds to wait for transaction completion.
286 -- application - Transaction program application short name.
287 -- program - Transaction program short name.
288 -- arg_n - Arguments 1 through 20 to the transaction program.
289 --
290 -- Each argument is at most 480 characters.
291 -- Individual arguments longer than 480 chars will be truncated.
292 --
293 --
294 -- OUT
295 -- outcome - varchar(30) - Transaction program completion status.
296 -- message - varchar(240) - Transaction program completion message.
297 --
298 function synchronous (timeout in number,
299 outcome in out NOCOPY varchar2,
300 message in out NOCOPY varchar2,
301 application in varchar2,
302 program in varchar2,
303 arg_1 in varchar2 default chr(0),
304 arg_2 in varchar2 default chr(0),
305 arg_3 in varchar2 default chr(0),
306 arg_4 in varchar2 default chr(0),
307 arg_5 in varchar2 default chr(0),
308 arg_6 in varchar2 default chr(0),
309 arg_7 in varchar2 default chr(0),
310 arg_8 in varchar2 default chr(0),
311 arg_9 in varchar2 default chr(0),
312 arg_10 in varchar2 default chr(0),
313 arg_11 in varchar2 default chr(0),
314 arg_12 in varchar2 default chr(0),
315 arg_13 in varchar2 default chr(0),
316 arg_14 in varchar2 default chr(0),
317 arg_15 in varchar2 default chr(0),
318 arg_16 in varchar2 default chr(0),
319 arg_17 in varchar2 default chr(0),
320 arg_18 in varchar2 default chr(0),
321 arg_19 in varchar2 default chr(0),
322 arg_20 in varchar2 default chr(0))
323 return number is
324
325 status number;
326 expiration_time date;
327 nls_lang varchar2(60);
328 nls_num_chars varchar2(60);
329 nls_date_lang varchar2(60);
330 secgrpid number;
331 enable_trace_flag varchar2(255);
332 error exception;
333 morg_cat varchar2(1);
334 org_type varchar2(1);
335 org_id number;
336
337 begin
338
339 initialize_globals;
340
341 if (debug_flag) then
342 debug_info('fnd_transaction.synchronous', 'Starting transaction', NULL);
343 end if;
344
345 if (timeout <= 0 or timeout is null) then
346 fnd_message.set_name('FND', 'CONC-TM-Invalid timeout');
347 debug_info('fnd_transaction.synchronous', 'Invalid timeout parameter', to_char(timeout));
348 raise error;
349 end if;
350
351 if (application is null) then
352 fnd_message.set_name('FND', 'CONC-TM-Application null');
353 debug_info('fnd_transaction.synchronous', 'NULL application parameter', NULL);
354 raise error;
355 end if;
356
357 if (program is null) then
358 fnd_message.set_name('FND', 'CONC-TM-Program null');
359 debug_info('fnd_transaction.synchronous', 'NULL program parameter', NULL);
360 raise error;
361 end if;
362
363 if (debug_flag) then
364 debug_info('fnd_transaction.synchronous', 'Using transport type', p_transport_type);
365 end if;
366
367 -- Get SQL_TRACE MULTI_ORG_CATEGORY
368 fnd_profile.get('SQL_TRACE', enable_trace_flag);
369
370 SELECT DECODE(P.ENABLE_TRACE, 'Y', 'Y', enable_trace_flag),
371 NVL(P.MULTI_ORG_CATEGORY, 'N'),
372 P.APPLICATION_ID, P.CONCURRENT_PROGRAM_ID
373 INTO enable_trace_flag, morg_cat,
374 g_program_appl_id, g_program_id
375 FROM FND_CONCURRENT_PROGRAMS P,
376 FND_APPLICATION A
377 where p.concurrent_program_name = program
378 and p.application_id = a.application_id
379 and a.application_short_name = application;
380
381 -- Get manager
382 if p_transport_type = 'PIPE' then
383 status := fnd_transaction_pipe.get_manager(application, program, token_timeout);
384 else
385 status := fnd_transaction_queue.get_manager(application, program, token_timeout);
386 end if;
387
388 if status = E_NOMGR then -- All managers busy
389 return status;
390 elsif status = E_OTHER then
391 raise error;
392 end if;
393
394
395 -- Get nls_lang, nls_date_language, nls_numeric_characters
396 nls_lang := substr(userenv('LANGUAGE'),1,instr(userenv('LANGUAGE'),'_')-1);
397
398 SELECT VALUE
399 into nls_date_lang
400 FROM V$NLS_PARAMETERS
401 Where PARAMETER = 'NLS_DATE_LANGUAGE';
402
403 SELECT VALUE
404 into nls_num_chars
405 FROM V$NLS_PARAMETERS
406 Where PARAMETER = 'NLS_NUMERIC_CHARACTERS';
407
408
409 --get security_group_id
410 secgrpid := fnd_global.security_group_id;
411
412 if (enable_trace_flag = 'Y') then
413 enable_trace_flag := 'TRUE';
414 else
415 enable_trace_flag := 'FALSE';
416 end if;
417
418 -- get org type and id
419 select nvl(mo_global.get_access_mode, morg_cat) into org_type from dual;
420 select nvl(mo_global.get_current_org_id, 0) into org_id from dual;
421
422 -- Request expires at SYSDATE + timeout
423 expiration_time := sysdate + (timeout * DAY_PER_SEC);
424
425 if (debug_flag) then
426 debug_info('fnd_transaction.synchronous',
427 'REQID:SECID:TRACE:EXPIRES',
428 to_char(request_id) || ':' || to_char(secgrpid) || ':'
429 || enable_trace_flag || ':' || to_char(expiration_time, 'DD-MON-RR HH24:MI:SS'));
430 debug_info('fnd_transaction.synchronous',
431 'NLS_LANG:DATE_LANG:NUM_CHARS',
432 nls_lang || ':' || nls_date_lang || ':' || nls_num_chars);
433
434
435 debug_info('fnd_transaction.synchronous',
436 'Packing packet type',
437 send_type);
438 debug_info('fnd_transaction.synchronous',
439 'Packing program application',
440 application);
441 debug_info('fnd_transaction.synchronous',
442 'Packing program',
443 program);
444 debug_info('fnd_transaction.synchronous',
445 'Packing org_type',
446 org_type);
447 debug_info('fnd_transaction.synchronous',
448 'Packing org_id',
449 org_id);
450 if (arg_1 = CHR(0)) then goto end_dbg; end if;
451 debug_info('fnd_transaction.synchronous',
452 'Packing arg 1',
453 arg_1);
454 if (arg_2 = CHR(0)) then goto end_dbg; end if;
455 debug_info('fnd_transaction.synchronous',
456 'Packing arg 2',
457 arg_2);
458 if (arg_3 = CHR(0)) then goto end_dbg; end if;
459 debug_info('fnd_transaction.synchronous',
460 'Packing arg 3',
461 arg_3);
462 if (arg_4 = CHR(0)) then goto end_dbg; end if;
463 debug_info('fnd_transaction.synchronous',
464 'Packing arg 4',
465 arg_4);
466 if (arg_5 = CHR(0)) then goto end_dbg; end if;
467 debug_info('fnd_transaction.synchronous',
468 'Packing arg 5',
469 arg_5);
470 if (arg_6 = CHR(0)) then goto end_dbg; end if;
471 debug_info('fnd_transaction.synchronous',
472 'Packing arg 6',
473 arg_6);
474 if (arg_7 = CHR(0)) then goto end_dbg; end if;
475 debug_info('fnd_transaction.synchronous',
476 'Packing arg 7',
477 arg_7);
478 if (arg_8 = CHR(0)) then goto end_dbg; end if;
479 debug_info('fnd_transaction.synchronous',
480 'Packing arg 8',
481 arg_8);
482 if (arg_9 = CHR(0)) then goto end_dbg; end if;
483 debug_info('fnd_transaction.synchronous',
484 'Packing arg 9',
485 arg_9);
486 if (arg_10 = CHR(0)) then goto end_dbg; end if;
487 debug_info('fnd_transaction.synchronous',
488 'Packing arg 10',
489 arg_10);
490 if (arg_11 = CHR(0)) then goto end_dbg; end if;
491 debug_info('fnd_transaction.synchronous',
492 'Packing arg 11',
493 arg_11);
494 if (arg_12 = CHR(0)) then goto end_dbg; end if;
495 debug_info('fnd_transaction.synchronous',
496 'Packing arg 12',
497 arg_12);
498 if (arg_13 = CHR(0)) then goto end_dbg; end if;
499 debug_info('fnd_transaction.synchronous',
500 'Packing arg 13',
501 arg_13);
502 if (arg_14 = CHR(0)) then goto end_dbg; end if;
503 debug_info('fnd_transaction.synchronous',
504 'Packing arg 14',
505 arg_14);
506 if (arg_15 = CHR(0)) then goto end_dbg; end if;
507 debug_info('fnd_transaction.synchronous',
508 'Packing arg 15',
509 arg_15);
510 if (arg_16 = CHR(0)) then goto end_dbg; end if;
511 debug_info('fnd_transaction.synchronous',
512 'Packing arg 16',
513 arg_16);
514 if (arg_17 = CHR(0)) then goto end_dbg; end if;
515 debug_info('fnd_transaction.synchronous',
516 'Packing arg 17',
517 arg_17);
518 if (arg_18 = CHR(0)) then goto end_dbg; end if;
519 debug_info('fnd_transaction.synchronous',
520 'Packing arg 18',
521 arg_18);
522 if (arg_19 = CHR(0)) then goto end_dbg; end if;
523 debug_info('fnd_transaction.synchronous',
524 'Packing arg 19',
525 arg_19);
526 if (arg_20 = CHR(0)) then goto end_dbg; end if;
527 debug_info('fnd_transaction.synchronous',
528 'Packing arg 20',
529 arg_20);
530
531 <<end_dbg>>
532 debug_info('fnd_transaction.synchronous', 'Timeout value', to_char(timeout));
533 end if;
534
535
536 if p_transport_type = 'PIPE' then
537 status := fnd_transaction_pipe.send_message(timeout, send_type, expiration_time, request_id,
538 nls_lang, nls_num_chars, nls_date_lang,
539 secgrpid, enable_trace_flag, application, program,
540 org_type, org_id, outcome, message,
541 arg_1, arg_2, arg_3, arg_4, arg_5,
542 arg_6, arg_7, arg_8, arg_9, arg_10,
543 arg_11, arg_12, arg_13, arg_14, arg_15,
544 arg_16, arg_17, arg_18, arg_19, arg_20);
545
546 else
547 status := fnd_transaction_queue.send_message(timeout, send_type, expiration_time, request_id,
548 nls_lang, nls_num_chars, nls_date_lang,
549 secgrpid, enable_trace_flag, application, program,
550 org_type, org_id, outcome, message,
551 arg_1, arg_2, arg_3, arg_4, arg_5,
552 arg_6, arg_7, arg_8, arg_9, arg_10,
553 arg_11, arg_12, arg_13, arg_14, arg_15,
554 arg_16, arg_17, arg_18, arg_19, arg_20);
555 end if;
556
557
558 if (debug_flag) then
559 debug_info('fnd_transaction.synchronous', 'Transaction complete', request_id, 'U');
560 end if;
561
562 return status;
563
564 exception
565
566 when error then
567 return E_OTHER;
568
569 when OTHERS then
570 fnd_message.set_name ('FND', 'SQL-Generic error');
571 fnd_message.set_token ('ERRNO', sqlcode, FALSE);
572 fnd_message.set_token ('REASON', sqlerrm, FALSE);
573 fnd_message.set_token ('ROUTINE', 'FND_TRANSACTION.SYNCHRONOUS', FALSE);
574 debug_info('fnd_transaction.synchronous', 'Caught exception', sqlerrm);
575 return E_OTHER;
576
577 end synchronous;
578
579
580 --
581 -- Function
582 -- get_values
583 -- Purpose
584 -- Retrieve the last transaction's return
585 -- values from the global table.
586 -- Arguments
587 -- OUT
588 -- arg_n - Returned values 1 through 20
589 --
590 function get_values (arg_1 in out NOCOPY varchar2,
591 arg_2 in out NOCOPY varchar2,
592 arg_3 in out NOCOPY varchar2,
593 arg_4 in out NOCOPY varchar2,
594 arg_5 in out NOCOPY varchar2,
595 arg_6 in out NOCOPY varchar2,
596 arg_7 in out NOCOPY varchar2,
597 arg_8 in out NOCOPY varchar2,
598 arg_9 in out NOCOPY varchar2,
599 arg_10 in out NOCOPY varchar2,
600 arg_11 in out NOCOPY varchar2,
601 arg_12 in out NOCOPY varchar2,
602 arg_13 in out NOCOPY varchar2,
603 arg_14 in out NOCOPY varchar2,
604 arg_15 in out NOCOPY varchar2,
605 arg_16 in out NOCOPY varchar2,
606 arg_17 in out NOCOPY varchar2,
607 arg_18 in out NOCOPY varchar2,
608 arg_19 in out NOCOPY varchar2,
609 arg_20 in out NOCOPY varchar2)
610 return number is
611 begin
612 arg_1 := return_values(1);
613 arg_2 := return_values(2);
614 arg_3 := return_values(3);
615 arg_4 := return_values(4);
616 arg_5 := return_values(5);
617 arg_6 := return_values(6);
618 arg_7 := return_values(7);
619 arg_8 := return_values(8);
620 arg_9 := return_values(9);
621 arg_10 := return_values(10);
622 arg_11 := return_values(11);
623 arg_12 := return_values(12);
624 arg_13 := return_values(13);
625 arg_14 := return_values(14);
626 arg_15 := return_values(15);
627 arg_16 := return_values(16);
628 arg_17 := return_values(17);
629 arg_18 := return_values(18);
630 arg_19 := return_values(19);
631 arg_20 := return_values(20);
632
633 for counter in 1..20 loop
634 return_values(counter) := null;
635 end loop;
636
637 return E_SUCCESS;
638
639 exception
640 when others then
641 fnd_message.set_name ('FND', 'SQL-Generic error');
642 fnd_message.set_token ('ERRNO', sqlcode, FALSE);
643 fnd_message.set_token ('REASON', sqlerrm, FALSE);
644 fnd_message.set_token ('ROUTINE', 'FND_TRANSACTION.GET_VALUES', FALSE);
645 return E_OTHER;
646 end get_values;
647
648
649
650
651 end fnd_transaction;