DBA Data[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;