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