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