[Home] [Help]
PACKAGE BODY: APPS.FND_APPLICATION_PKG
Source
1 package body FND_APPLICATION_PKG as
2 /* $Header: AFSCAPPB.pls 120.3 2005/10/05 13:24:10 pdeluna ship $ */
3
4 /* INSERT_ROW */
5 procedure INSERT_ROW (
6 X_ROWID in out nocopy VARCHAR2,
7 X_APPLICATION_ID in NUMBER,
8 X_APPLICATION_SHORT_NAME in VARCHAR2,
9 X_BASEPATH in VARCHAR2,
10 X_APPLICATION_NAME in VARCHAR2,
11 X_DESCRIPTION in VARCHAR2,
12 X_CREATION_DATE in DATE,
13 X_CREATED_BY in NUMBER,
14 X_LAST_UPDATE_DATE in DATE,
15 X_LAST_UPDATED_BY in NUMBER,
16 X_LAST_UPDATE_LOGIN in NUMBER,
17 X_PRODUCT_CODE in VARCHAR2
18 ) is
19 cursor C is select ROWID from FND_APPLICATION
20 where APPLICATION_ID = X_APPLICATION_ID;
21
22 begin
23
24 insert into FND_APPLICATION (
25 APPLICATION_ID,
26 APPLICATION_SHORT_NAME,
27 BASEPATH,
28 CREATION_DATE,
29 CREATED_BY,
30 LAST_UPDATE_DATE,
31 LAST_UPDATED_BY,
32 LAST_UPDATE_LOGIN,
33 PRODUCT_CODE
34 ) values (
35 X_APPLICATION_ID,
36 X_APPLICATION_SHORT_NAME,
37 X_BASEPATH,
38 X_CREATION_DATE,
39 X_CREATED_BY,
40 X_LAST_UPDATE_DATE,
41 X_LAST_UPDATED_BY,
42 X_LAST_UPDATE_LOGIN,
43 nvl(X_PRODUCT_CODE,X_APPLICATION_SHORT_NAME)
44 );
45
46 insert into FND_APPLICATION_TL (
47 APPLICATION_ID,
48 APPLICATION_NAME,
49 DESCRIPTION,
50 CREATED_BY,
51 CREATION_DATE,
52 LAST_UPDATED_BY,
53 LAST_UPDATE_DATE,
54 LAST_UPDATE_LOGIN,
55 LANGUAGE,
56 SOURCE_LANG
57 ) select
58 X_APPLICATION_ID,
59 X_APPLICATION_NAME,
60 decode(X_DESCRIPTION,
61 fnd_load_util.null_value,
62 null,
63 decode(instr(X_DESCRIPTION,fnd_load_util.null_value), 0,X_DESCRIPTION,
64 null)
65 ),
66 X_CREATED_BY,
67 X_CREATION_DATE,
68 X_LAST_UPDATED_BY,
69 X_LAST_UPDATE_DATE,
70 X_LAST_UPDATE_LOGIN,
71 L.LANGUAGE_CODE,
72 userenv('LANG')
73 from FND_LANGUAGES L
74 where L.INSTALLED_FLAG in ('I', 'B')
75 and not exists
76 (select NULL
77 from FND_APPLICATION_TL T
78 where T.APPLICATION_ID = X_APPLICATION_ID
79 and T.LANGUAGE = L.LANGUAGE_CODE);
80
81 open c;
82 fetch c into X_ROWID;
83 if (c%notfound) then
84 close c;
85 raise no_data_found;
86 end if;
87 close c;
88
89 end INSERT_ROW;
90
91 /* LOCK_ROW */
92 procedure LOCK_ROW (
93 X_APPLICATION_ID in NUMBER,
94 X_APPLICATION_SHORT_NAME in VARCHAR2,
95 X_BASEPATH in VARCHAR2,
96 X_APPLICATION_NAME in VARCHAR2,
97 X_DESCRIPTION in VARCHAR2
98 ) is
99 cursor c is select
100 APPLICATION_SHORT_NAME,
101 BASEPATH
102 from FND_APPLICATION
103 where APPLICATION_ID = X_APPLICATION_ID
104 for update of APPLICATION_ID nowait;
105 recinfo c%rowtype;
106
107 cursor c1 is select
108 APPLICATION_NAME,
109 DESCRIPTION
110 from FND_APPLICATION_TL
111 where APPLICATION_ID = X_APPLICATION_ID
112 and LANGUAGE = userenv('LANG')
113 for update of APPLICATION_ID nowait;
114 tlinfo c1%rowtype;
115
116 begin
117 open c;
118 fetch c into recinfo;
119 if (c%notfound) then
120 close c;
121 fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
122 app_exception.raise_exception;
123 end if;
124 close c;
125 if ( (recinfo.APPLICATION_SHORT_NAME = X_APPLICATION_SHORT_NAME)
126 AND ((recinfo.BASEPATH = X_BASEPATH)
127 OR ((recinfo.BASEPATH is null) AND (X_BASEPATH is null)))
128 ) then
129 null;
130 else
131 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
132 app_exception.raise_exception;
133 end if;
134
135 open c1;
136 fetch c1 into tlinfo;
137 if (c1%notfound) then
138 close c1;
139 return;
140 end if;
141 close c1;
142
143 if ( (tlinfo.APPLICATION_NAME = X_APPLICATION_NAME)
144 AND ((tlinfo.DESCRIPTION = X_DESCRIPTION)
145 OR ((tlinfo.DESCRIPTION is null) AND (X_DESCRIPTION is null)))
146 ) then
147 null;
148 else
149 fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
150 app_exception.raise_exception;
151 end if;
152 return;
153 end LOCK_ROW;
154
155 /* UPDATE_ROW */
156 procedure UPDATE_ROW(
157 X_APPLICATION_ID in NUMBER,
158 X_APPLICATION_SHORT_NAME in VARCHAR2,
159 X_BASEPATH in VARCHAR2,
160 X_APPLICATION_NAME in VARCHAR2,
161 X_DESCRIPTION in VARCHAR2,
162 X_LAST_UPDATE_DATE in DATE,
163 X_LAST_UPDATED_BY in NUMBER,
164 X_LAST_UPDATE_LOGIN in NUMBER,
165 X_PRODUCT_CODE in VARCHAR2
166 ) is
167
168 L_PRODUCT_CODE varchar2(50);
169
170 begin
171
172 /* If X_PRODUCT_CODE is null, do not overwrite existing PRODUCT_CODE with
173 null. PRODUCT_CODE is a nullable and non-unique column but it should
174 have a value which is normally equivalent to APPLICATION_SHORT_NAME.
175 See bug 2417010.
176 */
177 if X_PRODUCT_CODE is null then
178 update FND_APPLICATION set
179 APPLICATION_SHORT_NAME = X_APPLICATION_SHORT_NAME,
180 BASEPATH = X_BASEPATH,
181 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
182 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
183 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN
184 where APPLICATION_ID = X_APPLICATION_ID;
185 else
186 /* Ensure that the code does not allow the exception applications to be
187 overwritten with invalid product codes. This is consistent with
188 afprodcd.sql.
189 */
190 if (X_APPLICATION_SHORT_NAME in ('DT','FF','PAY','BEN','GHR','HR')) and
191 (X_PRODUCT_CODE <> 'PER') then
192 L_PRODUCT_CODE := 'PER';
193 elsif (X_APPLICATION_SHORT_NAME in ('SQLGL','RG')) and
194 (X_PRODUCT_CODE <> 'GL') then
195 L_PRODUCT_CODE := 'GL';
196 elsif (X_APPLICATION_SHORT_NAME = 'SQLAP') and
197 (X_PRODUCT_CODE <> 'AP') then
198 L_PRODUCT_CODE := 'AP';
199 elsif (X_APPLICATION_SHORT_NAME = 'OFA') and
200 (X_PRODUCT_CODE <> 'FA') then
201 L_PRODUCT_CODE := 'FA';
202 elsif (X_APPLICATION_SHORT_NAME = 'CST') and
203 (X_PRODUCT_CODE <> 'BOM') then
204 L_PRODUCT_CODE := 'BOM';
205 else
206 L_PRODUCT_CODE := X_PRODUCT_CODE;
207 end if;
208
209 update FND_APPLICATION set
210 APPLICATION_SHORT_NAME = X_APPLICATION_SHORT_NAME,
211 BASEPATH = X_BASEPATH,
212 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
213 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
214 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
215 PRODUCT_CODE = L_PRODUCT_CODE
216 where APPLICATION_ID = X_APPLICATION_ID;
217 end if;
218
219 if (sql%notfound) then
220 raise no_data_found;
221 end if;
222
223 update FND_APPLICATION_TL set
224 APPLICATION_NAME = X_APPLICATION_NAME,
225 DESCRIPTION = decode(X_DESCRIPTION,
226 fnd_load_util.null_value,
227 null,
228 null,
229 description,
230 decode(instr(X_DESCRIPTION,fnd_load_util.null_value),
231 0,
232 X_DESCRIPTION,
233 null)
234 ),
235 LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
236 LAST_UPDATED_BY = X_LAST_UPDATED_BY,
237 LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
238 SOURCE_LANG = userenv('LANG')
239 where APPLICATION_ID = X_APPLICATION_ID
240 and userenv('LANG') in (LANGUAGE, SOURCE_LANG);
241
242 if (sql%notfound) then
243 raise no_data_found;
244 end if;
245 end UPDATE_ROW;
246
247 /* LOAD_ROW*/
248 procedure LOAD_ROW (
249 X_APPLICATION_SHORT_NAME in VARCHAR2,
250 X_OWNER in VARCHAR2,
251 X_BASEPATH in VARCHAR2,
252 X_APPLICATION_NAME in VARCHAR2,
253 X_DESCRIPTION in VARCHAR2,
254 X_PRODUCT_CODE in VARCHAR2
255 ) is
256 begin
257 fnd_application_pkg.load_row(
258 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
259 X_OWNER => X_OWNER,
260 X_BASEPATH => X_BASEPATH,
261 X_APPLICATION_NAME => X_APPLICATION_NAME,
262 X_DESCRIPTION => X_DESCRIPTION,
263 X_CUSTOM_MODE => '',
264 X_LAST_UPDATE_DATE => '',
265 X_PRODUCT_CODE => X_PRODUCT_CODE
266 );
267
268 end LOAD_ROW;
269
270 /* Overloaded version #1 of LOAD_ROW. */
271 procedure LOAD_ROW (
272 X_APPLICATION_SHORT_NAME in VARCHAR2,
273 X_OWNER in VARCHAR2,
274 X_BASEPATH in VARCHAR2,
275 X_APPLICATION_NAME in VARCHAR2,
276 X_DESCRIPTION in VARCHAR2,
277 X_CUSTOM_MODE in VARCHAR2,
278 X_LAST_UPDATE_DATE in VARCHAR2,
279 X_PRODUCT_CODE in VARCHAR2
280 ) is
281 app_id number;
282 begin
283 select application_id into app_id
284 from fnd_application
285 where application_short_name = X_APPLICATION_SHORT_NAME;
286
287 fnd_application_pkg.load_row(
288 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
289 X_APPLICATION_ID => app_id,
290 X_OWNER => X_OWNER,
291 X_BASEPATH => X_BASEPATH,
292 X_APPLICATION_NAME => X_APPLICATION_NAME,
293 X_DESCRIPTION => X_DESCRIPTION,
294 X_CUSTOM_MODE => X_CUSTOM_MODE,
295 X_LAST_UPDATE_DATE => X_LAST_UPDATE_DATE,
296 X_PRODUCT_CODE => X_PRODUCT_CODE
297 );
298 exception
299 when NO_DATA_FOUND then
300
301 select fnd_application_s.nextval into app_id from dual;
302
303 fnd_application_pkg.load_row(
304 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
305 X_APPLICATION_ID => app_id,
306 X_OWNER => X_OWNER,
307 X_BASEPATH => X_BASEPATH,
308 X_APPLICATION_NAME => X_APPLICATION_NAME,
309 X_DESCRIPTION => X_DESCRIPTION,
310 X_CUSTOM_MODE => X_CUSTOM_MODE,
311 X_LAST_UPDATE_DATE => X_LAST_UPDATE_DATE,
312 X_PRODUCT_CODE => X_PRODUCT_CODE
313 );
314 end LOAD_ROW;
315
316 /* Overloaded version #2 of LOAD_ROW. */
317 procedure LOAD_ROW (
318 X_APPLICATION_SHORT_NAME in VARCHAR2,
319 X_APPLICATION_ID in NUMBER,
320 X_OWNER in VARCHAR2,
321 X_BASEPATH in VARCHAR2,
322 X_APPLICATION_NAME in VARCHAR2,
323 X_DESCRIPTION in VARCHAR2,
324 X_CUSTOM_MODE in VARCHAR2,
325 X_LAST_UPDATE_DATE in VARCHAR2,
326 X_PRODUCT_CODE in VARCHAR2
327 ) is
328
329 user_id number := 0;
330 app_id number;
331 row_id varchar2(64);
332 f_luby number; -- entity owner in file
333 f_ludate date; -- entity update date in file
334 db_luby number; -- entity owner in db
335 db_ludate date; -- entity update date in db
336
337 begin
338
339 -- Translate owner to file_last_updated_by
340 f_luby := fnd_load_util.owner_id(x_owner);
341
342 -- Translate char last_update_date to date
343 f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
344
345 -- This select stmnt also checks if
346 -- there is a row for this app_id and this app_short_name
347 -- Exception is thrown otherwise.
348 select LAST_UPDATED_BY, LAST_UPDATE_DATE
349 into db_luby, db_ludate
350 FROM FND_APPLICATION
351 where application_short_name = X_APPLICATION_SHORT_NAME
352 and application_id = X_APPLICATION_ID;
353
354 if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
355 db_ludate, X_CUSTOM_MODE)) then
356 fnd_application_pkg.UPDATE_ROW (
357 X_APPLICATION_ID => X_APPLICATION_ID,
358 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
359 X_BASEPATH => X_BASEPATH,
360 X_APPLICATION_NAME => X_APPLICATION_NAME,
361 X_DESCRIPTION => X_DESCRIPTION,
362 X_LAST_UPDATE_DATE => f_ludate,
363 X_LAST_UPDATED_BY => f_luby,
364 X_LAST_UPDATE_LOGIN => 0,
365 X_PRODUCT_CODE => X_PRODUCT_CODE);
366 end if;
367 exception
368 when NO_DATA_FOUND then
369
370 declare
371 l_count number;
372 begin
373 -- This select stmnt checks the condition
374 -- that if a row exists for this apps_short_name
375 -- but with a different apps_id, or
376 -- a record exist for this app_id with a different
377 -- apps_short_name. Exception is thrown otherwise.
378 select count(*) into l_count
379 from fnd_application
380 where application_short_name = X_APPLICATION_SHORT_NAME
381 or application_id = X_APPLICATION_ID;
382
383 if (l_count > 0) then
384 -- FND message come here
385 fnd_message.set_name('FND', 'FND_INVALID_APPLICATION');
386 fnd_message.set_token('NAME', X_APPLICATION_SHORT_NAME);
387 fnd_message.set_token('ID', X_APPLICATION_ID);
388 app_exception.raise_exception;
389 end if;
390
391 --select fnd_application_s.nextval into app_id from dual;
392 fnd_application_pkg.INSERT_ROW(
393 X_ROWID => row_id,
394 X_APPLICATION_ID => X_APPLICATION_ID,
395 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
396 X_BASEPATH => X_BASEPATH,
400 X_CREATED_BY => f_luby,
397 X_APPLICATION_NAME => X_APPLICATION_NAME,
398 X_DESCRIPTION => X_DESCRIPTION,
399 X_CREATION_DATE => f_ludate,
401 X_LAST_UPDATE_DATE => f_ludate,
402 X_LAST_UPDATED_BY => f_luby,
403 X_LAST_UPDATE_LOGIN => 0 ,
404 X_PRODUCT_CODE => X_PRODUCT_CODE);
405 end;
406 end LOAD_ROW;
407
408 /* TRANSLATE_ROW */
409 procedure TRANSLATE_ROW (
410 X_APPLICATION_SHORT_NAME in VARCHAR2,
411 X_OWNER in VARCHAR2,
412 X_APPLICATION_NAME in VARCHAR2,
413 X_DESCRIPTION in VARCHAR2
414 ) is
415 begin
416 fnd_application_pkg.translate_row(
417 X_APPLICATION_SHORT_NAME => X_APPLICATION_SHORT_NAME,
418 X_OWNER => X_OWNER,
419 X_APPLICATION_NAME => X_APPLICATION_NAME,
420 X_DESCRIPTION => X_DESCRIPTION,
421 x_custom_mode => null,
422 x_last_update_date => null);
423 end TRANSLATE_ROW;
424
425 /* Overloaded version of TRANSLATE_ROW */
426 procedure TRANSLATE_ROW (
427 X_APPLICATION_SHORT_NAME in VARCHAR2,
428 X_OWNER in VARCHAR2,
429 X_APPLICATION_NAME in VARCHAR2,
430 X_DESCRIPTION in VARCHAR2,
431 x_custom_mode in VARCHAR2,
432 x_last_update_date in VARCHAR2
433 ) is
434 f_luby number; -- entity owner in file
435 f_ludate date; -- entity update date in file
436 db_luby number; -- entity owner in db
437 db_ludate date; -- entity update date in db
438
439 begin
440
441 -- Translate owner to file_last_updated_by
442 f_luby := fnd_load_util.owner_id(x_owner);
443
444 -- Translate char last_update_date to date
445 f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
446
447 begin
448 select LAST_UPDATED_BY, LAST_UPDATE_DATE
449 into db_luby, db_ludate
450 from fnd_application_tl
451 where application_id =
452 (select application_id
453 from fnd_application
454 where application_short_name = X_APPLICATION_SHORT_NAME)
455 and LANGUAGE = userenv('LANG');
456
457 if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
458 db_ludate, X_CUSTOM_MODE)) then
459 update fnd_application_tl set
460 application_name = nvl(X_APPLICATION_NAME, application_name),
461 description = decode(X_DESCRIPTION,
462 fnd_load_util.null_value,
463 null,
464 null,
465 description,
466 decode(instr(X_DESCRIPTION,fnd_load_util.null_value),
467 0,
468 X_DESCRIPTION,
469 null)
470 ),
471 source_lang = userenv('LANG'),
472 last_update_date = f_ludate,
473 last_updated_by = f_luby,
474 last_update_login = 0
475 where application_id =
476 (select application_id
477 from fnd_application
478 where application_short_name = X_APPLICATION_SHORT_NAME)
479 and userenv('LANG') in (language, source_lang);
480 end if;
481 exception
482 when no_data_found then
483 null;
484 end;
485 end TRANSLATE_ROW;
486
487 /* DELETE_ROW */
488 procedure DELETE_ROW (
489 X_APPLICATION_ID in NUMBER
490 ) is
491 begin
492 delete from FND_APPLICATION
493 where APPLICATION_ID = X_APPLICATION_ID;
494
495 if (sql%notfound) then
496 raise no_data_found;
497 end if;
498
499 delete from FND_APPLICATION_TL
500 where APPLICATION_ID = X_APPLICATION_ID;
501
502 if (sql%notfound) then
503 raise no_data_found;
504 end if;
505 end DELETE_ROW;
506
507 /* ADD_LANGUAGE */
508 procedure ADD_LANGUAGE
509 is
510 begin
511
512 /* Mar/19/03 requested by Ric Ginsberg */
513 /* The following delete and update statements are commented out */
514 /* as a quick workaround to fix the time-consuming table handler issue */
515 /* Eventually we'll need to turn them into a separate fix_language procedure */
516 /*
517 delete from FND_APPLICATION_TL T
518 where not exists
519 (select NULL
520 from FND_APPLICATION B
521 where B.APPLICATION_ID = T.APPLICATION_ID
522 );
523
524 update FND_APPLICATION_TL T set (
525 APPLICATION_NAME,
526 DESCRIPTION
527 ) = (select
528 B.APPLICATION_NAME,
529 B.DESCRIPTION
530 from FND_APPLICATION_TL B
531 where B.APPLICATION_ID = T.APPLICATION_ID
532 and B.LANGUAGE = T.SOURCE_LANG)
533 where (
534 T.APPLICATION_ID,
535 T.LANGUAGE
536 ) in (select
537 SUBT.APPLICATION_ID,
538 SUBT.LANGUAGE
539 from FND_APPLICATION_TL SUBB, FND_APPLICATION_TL SUBT
543 or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
540 where SUBB.APPLICATION_ID = SUBT.APPLICATION_ID
541 and SUBB.LANGUAGE = SUBT.SOURCE_LANG
542 and (SUBB.APPLICATION_NAME <> SUBT.APPLICATION_NAME
544 or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
545 or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
546 ))
547 -- ***** BEGIN NEW CLAUSE FOR UPDATE *****
548 and not exists
549 (select null
550 from FND_APPLICATION_TL DUP
551 where DUP.LANGUAGE = T.LANGUAGE
552 and (DUP.APPLICATION_NAME) =
553 (select
554 B.APPLICATION_NAME
555 from FND_APPLICATION_TL B
556 where B.APPLICATION_ID = T.APPLICATION_ID
557 and B.LANGUAGE = T.SOURCE_LANG));
558 -- ***** END NEW CLAUSE FOR UPDATE *****
559
560 -- ***** NEW CODE FOR INSERT HERE *****
561 loop
562 update FND_APPLICATION_TL set
563 APPLICATION_NAME = '@'||APPLICATION_NAME
564 where (APPLICATION_NAME, LANGUAGE) in
565 (select
566 B.APPLICATION_NAME,
567 L.LANGUAGE_CODE
568 from FND_APPLICATION_TL B, FND_LANGUAGES L
569 where L.INSTALLED_FLAG in ('I', 'B')
570 and B.LANGUAGE = userenv('LANG')
571 and not exists
572 (select NULL
573 from FND_APPLICATION_TL T
574 where T.APPLICATION_ID = B.APPLICATION_ID
575 and T.LANGUAGE = L.LANGUAGE_CODE));
576
577 exit when SQL%ROWCOUNT = 0;
578 end loop;
582 insert into FND_APPLICATION_TL (
579 -- ***** END CODE FOR INSERT HERE *****
580
581 */
583 APPLICATION_ID,
584 APPLICATION_NAME,
585 DESCRIPTION,
586 CREATED_BY,
587 CREATION_DATE,
588 LAST_UPDATED_BY,
589 LAST_UPDATE_DATE,
590 LAST_UPDATE_LOGIN,
591 LANGUAGE,
592 SOURCE_LANG
593 ) select
594 B.APPLICATION_ID,
595 B.APPLICATION_NAME,
596 B.DESCRIPTION,
597 B.CREATED_BY,
598 B.CREATION_DATE,
599 B.LAST_UPDATED_BY,
600 B.LAST_UPDATE_DATE,
601 B.LAST_UPDATE_LOGIN,
602 L.LANGUAGE_CODE,
603 B.SOURCE_LANG
604 from FND_APPLICATION_TL B, FND_LANGUAGES L
605 where L.INSTALLED_FLAG in ('I', 'B')
606 and B.LANGUAGE = userenv('LANG')
607 and not exists
608 (select NULL
609 from FND_APPLICATION_TL T
610 where T.APPLICATION_ID = B.APPLICATION_ID
611 and T.LANGUAGE = L.LANGUAGE_CODE);
612 end ADD_LANGUAGE;
613
614 end FND_APPLICATION_PKG;