[Home] [Help]
PACKAGE BODY: APPS.FND_TRANSACTION
Source
1 package body fnd_transaction as
2 /* $Header: AFCPTRNB.pls 120.10 2011/04/04 20:08:27 pferguso 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 -- Check to see if we are running in the PATCH edition
340 -- If so we must not allow any transactions to take place
341 if ad_zd.get_edition_type(sys_context('userenv', 'current_edition_name')) = 'PATCH' then
342 fnd_message.set_name('FND', 'CONC-TM-Transactions disabled');
343 raise error;
344 end if;
345
346 initialize_globals;
347
348 if (debug_flag) then
349 debug_info('fnd_transaction.synchronous', 'Starting transaction', NULL);
350 end if;
351
352 if (timeout <= 0 or timeout is null) then
353 fnd_message.set_name('FND', 'CONC-TM-Invalid timeout');
354 debug_info('fnd_transaction.synchronous', 'Invalid timeout parameter', to_char(timeout));
355 raise error;
356 end if;
357
358 if (application is null) then
359 fnd_message.set_name('FND', 'CONC-TM-Application null');
360 debug_info('fnd_transaction.synchronous', 'NULL application parameter', NULL);
361 raise error;
362 end if;
363
364 if (program is null) then
365 fnd_message.set_name('FND', 'CONC-TM-Program null');
366 debug_info('fnd_transaction.synchronous', 'NULL program parameter', NULL);
367 raise error;
368 end if;
369
370 if (debug_flag) then
371 debug_info('fnd_transaction.synchronous', 'Using transport type', p_transport_type);
372 end if;
373
374 -- Get SQL_TRACE MULTI_ORG_CATEGORY
375 fnd_profile.get('SQL_TRACE', enable_trace_flag);
376
377 SELECT DECODE(P.ENABLE_TRACE, 'Y', 'Y', enable_trace_flag),
378 NVL(P.MULTI_ORG_CATEGORY, 'N'),
379 P.APPLICATION_ID, P.CONCURRENT_PROGRAM_ID
380 INTO enable_trace_flag, morg_cat,
381 g_program_appl_id, g_program_id
382 FROM FND_CONCURRENT_PROGRAMS P,
383 FND_APPLICATION A
384 where p.concurrent_program_name = program
385 and p.application_id = a.application_id
386 and a.application_short_name = application;
387
388 -- Get manager
389 if p_transport_type = 'PIPE' then
390 status := fnd_transaction_pipe.get_manager(application, program, token_timeout);
391 else
392 status := fnd_transaction_queue.get_manager(application, program, token_timeout);
393 end if;
394
395 if status = E_NOMGR then -- All managers busy
396 return status;
397 elsif status = E_OTHER then
398 raise error;
399 end if;
400
401
402 -- Get nls_lang, nls_date_language, nls_numeric_characters
403 nls_lang := substr(userenv('LANGUAGE'),1,instr(userenv('LANGUAGE'),'_')-1);
404
405 SELECT VALUE
406 into nls_date_lang
407 FROM V$NLS_PARAMETERS
408 Where PARAMETER = 'NLS_DATE_LANGUAGE';
409
410 SELECT VALUE
411 into nls_num_chars
412 FROM V$NLS_PARAMETERS
413 Where PARAMETER = 'NLS_NUMERIC_CHARACTERS';
414
415
416 --get security_group_id
417 secgrpid := fnd_global.security_group_id;
418
419 if (enable_trace_flag = 'Y') then
420 enable_trace_flag := 'TRUE';
421 else
422 enable_trace_flag := 'FALSE';
423 end if;
424
425 -- get org type and id
426 select nvl(mo_global.get_access_mode, morg_cat) into org_type from dual;
427 select nvl(mo_global.get_current_org_id, 0) into org_id from dual;
428
429 -- Request expires at SYSDATE + timeout
430 expiration_time := sysdate + (timeout * DAY_PER_SEC);
431
432 if (debug_flag) then
433 debug_info('fnd_transaction.synchronous',
434 'REQID:SECID:TRACE:EXPIRES',
435 to_char(request_id) || ':' || to_char(secgrpid) || ':'
436 || enable_trace_flag || ':' || to_char(expiration_time, 'DD-MON-RR HH24:MI:SS'));
437 debug_info('fnd_transaction.synchronous',
438 'NLS_LANG:DATE_LANG:NUM_CHARS',
439 nls_lang || ':' || nls_date_lang || ':' || nls_num_chars);
440
441
442 debug_info('fnd_transaction.synchronous',
443 'Packing packet type',
444 send_type);
445 debug_info('fnd_transaction.synchronous',
446 'Packing program application',
447 application);
448 debug_info('fnd_transaction.synchronous',
449 'Packing program',
450 program);
451 debug_info('fnd_transaction.synchronous',
452 'Packing org_type',
453 org_type);
454 debug_info('fnd_transaction.synchronous',
455 'Packing org_id',
456 org_id);
457 if (arg_1 = CHR(0)) then goto end_dbg; end if;
458 debug_info('fnd_transaction.synchronous',
459 'Packing arg 1',
460 arg_1);
461 if (arg_2 = CHR(0)) then goto end_dbg; end if;
462 debug_info('fnd_transaction.synchronous',
463 'Packing arg 2',
464 arg_2);
465 if (arg_3 = CHR(0)) then goto end_dbg; end if;
466 debug_info('fnd_transaction.synchronous',
467 'Packing arg 3',
468 arg_3);
469 if (arg_4 = CHR(0)) then goto end_dbg; end if;
470 debug_info('fnd_transaction.synchronous',
471 'Packing arg 4',
472 arg_4);
473 if (arg_5 = CHR(0)) then goto end_dbg; end if;
474 debug_info('fnd_transaction.synchronous',
475 'Packing arg 5',
476 arg_5);
477 if (arg_6 = CHR(0)) then goto end_dbg; end if;
478 debug_info('fnd_transaction.synchronous',
479 'Packing arg 6',
480 arg_6);
481 if (arg_7 = CHR(0)) then goto end_dbg; end if;
482 debug_info('fnd_transaction.synchronous',
483 'Packing arg 7',
484 arg_7);
485 if (arg_8 = CHR(0)) then goto end_dbg; end if;
486 debug_info('fnd_transaction.synchronous',
487 'Packing arg 8',
488 arg_8);
489 if (arg_9 = CHR(0)) then goto end_dbg; end if;
490 debug_info('fnd_transaction.synchronous',
491 'Packing arg 9',
492 arg_9);
493 if (arg_10 = CHR(0)) then goto end_dbg; end if;
494 debug_info('fnd_transaction.synchronous',
495 'Packing arg 10',
496 arg_10);
497 if (arg_11 = CHR(0)) then goto end_dbg; end if;
498 debug_info('fnd_transaction.synchronous',
499 'Packing arg 11',
500 arg_11);
501 if (arg_12 = CHR(0)) then goto end_dbg; end if;
502 debug_info('fnd_transaction.synchronous',
503 'Packing arg 12',
504 arg_12);
505 if (arg_13 = CHR(0)) then goto end_dbg; end if;
506 debug_info('fnd_transaction.synchronous',
507 'Packing arg 13',
508 arg_13);
509 if (arg_14 = CHR(0)) then goto end_dbg; end if;
510 debug_info('fnd_transaction.synchronous',
511 'Packing arg 14',
512 arg_14);
513 if (arg_15 = CHR(0)) then goto end_dbg; end if;
514 debug_info('fnd_transaction.synchronous',
515 'Packing arg 15',
516 arg_15);
517 if (arg_16 = CHR(0)) then goto end_dbg; end if;
518 debug_info('fnd_transaction.synchronous',
519 'Packing arg 16',
520 arg_16);
521 if (arg_17 = CHR(0)) then goto end_dbg; end if;
522 debug_info('fnd_transaction.synchronous',
523 'Packing arg 17',
524 arg_17);
525 if (arg_18 = CHR(0)) then goto end_dbg; end if;
526 debug_info('fnd_transaction.synchronous',
527 'Packing arg 18',
528 arg_18);
529 if (arg_19 = CHR(0)) then goto end_dbg; end if;
530 debug_info('fnd_transaction.synchronous',
531 'Packing arg 19',
532 arg_19);
533 if (arg_20 = CHR(0)) then goto end_dbg; end if;
534 debug_info('fnd_transaction.synchronous',
535 'Packing arg 20',
536 arg_20);
537
538 <<end_dbg>>
539 debug_info('fnd_transaction.synchronous', 'Timeout value', to_char(timeout));
540 end if;
541
542
543 if p_transport_type = 'PIPE' then
544 status := fnd_transaction_pipe.send_message(timeout, send_type, expiration_time, request_id,
545 nls_lang, nls_num_chars, nls_date_lang,
546 secgrpid, enable_trace_flag, application, program,
547 org_type, org_id, outcome, message,
548 arg_1, arg_2, arg_3, arg_4, arg_5,
549 arg_6, arg_7, arg_8, arg_9, arg_10,
550 arg_11, arg_12, arg_13, arg_14, arg_15,
551 arg_16, arg_17, arg_18, arg_19, arg_20);
552
553 else
554 status := fnd_transaction_queue.send_message(timeout, send_type, expiration_time, request_id,
555 nls_lang, nls_num_chars, nls_date_lang,
556 secgrpid, enable_trace_flag, application, program,
557 org_type, org_id, outcome, message,
558 arg_1, arg_2, arg_3, arg_4, arg_5,
559 arg_6, arg_7, arg_8, arg_9, arg_10,
560 arg_11, arg_12, arg_13, arg_14, arg_15,
561 arg_16, arg_17, arg_18, arg_19, arg_20);
562 end if;
563
564
565 if (debug_flag) then
566 debug_info('fnd_transaction.synchronous', 'Transaction complete', request_id, 'U');
567 end if;
568
569 return status;
570
571 exception
572
573 when error then
574 return E_OTHER;
575
576 when OTHERS then
577 fnd_message.set_name ('FND', 'SQL-Generic error');
578 fnd_message.set_token ('ERRNO', sqlcode, FALSE);
579 fnd_message.set_token ('REASON', sqlerrm, FALSE);
580 fnd_message.set_token ('ROUTINE', 'FND_TRANSACTION.SYNCHRONOUS', FALSE);
581 debug_info('fnd_transaction.synchronous', 'Caught exception', sqlerrm);
582 return E_OTHER;
583
584 end synchronous;
585
586
587 --
588 -- Function
589 -- get_values
590 -- Purpose
591 -- Retrieve the last transaction's return
592 -- values from the global table.
593 -- Arguments
594 -- OUT
595 -- arg_n - Returned values 1 through 20
596 --
597 function get_values (arg_1 in out NOCOPY varchar2,
598 arg_2 in out NOCOPY varchar2,
599 arg_3 in out NOCOPY varchar2,
600 arg_4 in out NOCOPY varchar2,
601 arg_5 in out NOCOPY varchar2,
602 arg_6 in out NOCOPY varchar2,
603 arg_7 in out NOCOPY varchar2,
604 arg_8 in out NOCOPY varchar2,
605 arg_9 in out NOCOPY varchar2,
606 arg_10 in out NOCOPY varchar2,
607 arg_11 in out NOCOPY varchar2,
608 arg_12 in out NOCOPY varchar2,
609 arg_13 in out NOCOPY varchar2,
610 arg_14 in out NOCOPY varchar2,
611 arg_15 in out NOCOPY varchar2,
612 arg_16 in out NOCOPY varchar2,
613 arg_17 in out NOCOPY varchar2,
614 arg_18 in out NOCOPY varchar2,
615 arg_19 in out NOCOPY varchar2,
616 arg_20 in out NOCOPY varchar2)
617 return number is
618 begin
619 arg_1 := return_values(1);
620 arg_2 := return_values(2);
621 arg_3 := return_values(3);
622 arg_4 := return_values(4);
623 arg_5 := return_values(5);
624 arg_6 := return_values(6);
625 arg_7 := return_values(7);
626 arg_8 := return_values(8);
627 arg_9 := return_values(9);
628 arg_10 := return_values(10);
629 arg_11 := return_values(11);
630 arg_12 := return_values(12);
631 arg_13 := return_values(13);
632 arg_14 := return_values(14);
633 arg_15 := return_values(15);
634 arg_16 := return_values(16);
635 arg_17 := return_values(17);
636 arg_18 := return_values(18);
637 arg_19 := return_values(19);
638 arg_20 := return_values(20);
639
640 for counter in 1..20 loop
641 return_values(counter) := null;
642 end loop;
643
644 return E_SUCCESS;
645
646 exception
647 when others then
648 fnd_message.set_name ('FND', 'SQL-Generic error');
649 fnd_message.set_token ('ERRNO', sqlcode, FALSE);
650 fnd_message.set_token ('REASON', sqlerrm, FALSE);
651 fnd_message.set_token ('ROUTINE', 'FND_TRANSACTION.GET_VALUES', FALSE);
652 return E_OTHER;
653 end get_values;
654
655
656
657
658 end fnd_transaction;