DBA Data[Home] [Help]

PACKAGE BODY: APPS.FND_OAM_DS_ALGOS_PKG

Source


1 PACKAGE BODY FND_OAM_DS_ALGOS_PKG as
2 /* $Header: AFOAMDSALGOB.pls 120.3 2006/01/17 11:43 ilawler noship $ */
3 
4    ----------------------------------------
5    -- Private Body Constants
6    ----------------------------------------
7    PKG_NAME                     CONSTANT VARCHAR2(20) := 'DS_ALGOS_PKG.';
8 
9    -- When algorithms are resolved, we cache the details of that resolution locally
10    -- because it's common to re-use algorithms many times in one configuration import.
11    -- Only cache the raw algo text to prevent the query, don't cache it with substitutions
12    -- because the substitutions shouldn't repeat.
13    TYPE b_algo_cache_entry_type IS RECORD
14       (
15        is_valid                 BOOLEAN         := FALSE,
16        used_algo_id             NUMBER          := NULL,
17        datatype                 VARCHAR2(30)    := NULL,
18        raw_algo_text            VARCHAR2(4000)  := NULL,
19        weight_modifier          NUMBER          := NULL
20        );
21 
22    TYPE b_algo_cache_type IS TABLE OF b_algo_cache_entry_type INDEX BY BINARY_INTEGER;
23    b_algo_cache         b_algo_cache_type;
24 
25    --cache for queried default algorithms, datatype->algo_id
26    TYPE b_default_algo_cache_type IS TABLE OF NUMBER INDEX BY VARCHAR2(30);
27    b_default_algo_cache         b_default_algo_cache_type;
28 
29    --#########################################
30    --  Substitition Token-related constants --
31    --#########################################
32 
33    -- This is the token identifying delimiter, present before and after a token
34    B_TOK_DELIM                  CONSTANT VARCHAR2(3) := '%';
35 
36    -- These are the substitution tokens we accept
37    B_TOKEN_TABLE_OWNER          CONSTANT VARCHAR2(60) := B_TOK_DELIM||'table_owner'||B_TOK_DELIM;
38    B_TOKEN_TABLE_NAME           CONSTANT VARCHAR2(60) := B_TOK_DELIM||'table_name'||B_TOK_DELIM;
39    B_TOKEN_COLUMN_NAME          CONSTANT VARCHAR2(60) := B_TOK_DELIM||'column_name'||B_TOK_DELIM;
40 
41    -- This is the substitution token state
42    --b_token_table_initialized  BOOLEAN := FALSE;
43    --TYPE b_token_table_type IS TABLE OF VARCHAR2(60);
44    --b_token_table              b_token_table_type;
45 
46    ----------------------------------------
47    -- Public/Private Procedures/Functions
48    ----------------------------------------
49 
50    -- Public
51    FUNCTION GET_ALGO_ID(p_display_name  IN VARCHAR2)
52       RETURN NUMBER
53    IS
54       l_algo_id         NUMBER;
55    BEGIN
56       --don't allow the name NULL
57       IF p_display_name IS NULL THEN
58          RAISE NO_DATA_FOUND;
59       END IF;
60 
61       SELECT algo_id
62          INTO l_algo_id
63          FROM fnd_oam_ds_algos_tl
64          WHERE display_name = p_display_name
65          AND language = USERENV('LANG');
66 
67       RETURN l_algo_id;
68    END;
69 
70    -- Private
71    -- Given some raw algorithm text, perform substitutions on all known substitution tokens
72    PROCEDURE REPLACE_SUBSTITUTION_TOKENS(p_raw_algo_text        IN VARCHAR2,
73                                          p_table_owner          IN VARCHAR2,
74                                          p_table_name           IN VARCHAR2,
75                                          p_column_name          IN VARCHAR2,
76                                          x_new_algo_text        OUT NOCOPY VARCHAR2)
77    IS
78       l_text    VARCHAR2(4000) := p_raw_algo_text;
79    BEGIN
80       -- issue each of the replace statements, this needs to be changed when new tokens are added
81       -- if the new text is beyond the l_text max length, let the exception bubble up
82       l_text := REPLACE(l_text, B_TOKEN_TABLE_OWNER, p_table_owner);
83       l_text := REPLACE(l_text, B_TOKEN_TABLE_NAME, p_table_name);
84       l_text := REPLACE(l_text, B_TOKEN_COLUMN_NAME, p_column_name);
85 
86       x_new_algo_text := l_text;
87    END;
88 
89    -- Private
90    -- Creates and caches a new algo_cache_entry_type when we found a bad algo definition
91    PROCEDURE ADD_BAD_ALGO_CACHE_ENTRY(p_algo_id         IN NUMBER)
92    IS
93       l_entry   b_algo_cache_entry_type;
94    BEGIN
95       l_entry.is_valid          := FALSE;
96 
97       b_algo_cache(p_algo_id) := l_entry;
98    END;
99 
100    -- Private
101    -- Creates and caches a new, valid algo_cache_entry_type
102    PROCEDURE ADD_ALGO_CACHE_ENTRY(p_algo_id             IN NUMBER,
103                                   p_used_algo_id        IN NUMBER,
104                                   p_datatype            IN VARCHAR2,
105                                   p_raw_algo_text       IN VARCHAR2,
106                                   p_weight_modifier     IN NUMBER)
107    IS
108       l_entry   b_algo_cache_entry_type;
109    BEGIN
110       l_entry.used_algo_id      := p_used_algo_id;
111       l_entry.datatype          := p_datatype;
112       l_entry.raw_algo_text     := p_raw_algo_text;
113       l_entry.weight_modifier   := p_weight_modifier;
114       l_entry.is_valid          := TRUE;
115 
116       b_algo_cache(p_algo_id) := l_entry;
117    END;
118 
119    -- Public
120    PROCEDURE RESOLVE_ALGO_ID(p_algo_id                  IN NUMBER,
121                              p_table_owner              IN VARCHAR2 DEFAULT NULL,
122                              p_table_name               IN VARCHAR2 DEFAULT NULL,
123                              p_column_name              IN VARCHAR2 DEFAULT NULL,
124                              x_new_column_value         OUT NOCOPY VARCHAR2,
125                              x_weight_modifier          OUT NOCOPY NUMBER)
126    IS
127       l_ctxt            VARCHAR2(60) := PKG_NAME||'RESOLVE_ALGO_ID';
128 
129       l_current_algo_id         NUMBER;
130       l_use_algo_id             NUMBER;
131       l_datatype                VARCHAR2(30);
132       l_raw_algo_text           VARCHAR2(4000);
133       l_weight_modifier         NUMBER;
134 
135    BEGIN
136       fnd_oam_debug.log(2, l_ctxt, 'ENTER');
137 
138       --see if the algo misses the cache, if so find it's base definition and add it
139       IF NOT b_algo_cache.EXISTS(p_algo_id) THEN
140          fnd_oam_debug.log(1, l_ctxt, 'Uncached... finding root algo_id.');
141          --loop the fetch to resolve the chain of use_algo_id references
142          l_current_algo_id := p_algo_id;
143          WHILE TRUE LOOP
144             fnd_oam_debug.log(1, l_ctxt, 'Querying details for algo_id: '||l_current_algo_id);
145             --fetch attributes corresponding to the current algo id
146             BEGIN
147                SELECT use_algo_id, datatype, algo_text, weight_modifier
148                   INTO l_use_algo_id, l_datatype, l_raw_algo_text, l_weight_modifier
149                   FROM fnd_oam_ds_algos_b
150                   WHERE algo_id = l_current_algo_id
151                   AND SYSDATE BETWEEN NVL(START_DATE, SYSDATE) AND NVL(END_DATE, SYSDATE);
152             EXCEPTION
153                WHEN NO_DATA_FOUND THEN
154                   --if the lookup fails, store that failure in the cache
155                   fnd_oam_debug.log(3, l_ctxt, 'Failed to query algo_id from ds_algos_b - no data found.');
156                   ADD_BAD_ALGO_CACHE_ENTRY(p_algo_id => p_algo_id);
157                   RAISE;
158             END;
159 
160             --if there's no queried use_algo_id, we have our definition
161             IF l_use_algo_id IS NULL THEN
162                fnd_oam_debug.log(1, l_ctxt, 'Caching base algo_id: '||l_current_algo_id);
163                ADD_ALGO_CACHE_ENTRY(p_algo_id           => p_algo_id,
164                                     p_used_algo_id      => l_current_algo_id,
165                                     p_datatype          => l_datatype,
166                                     p_raw_algo_text     => l_raw_algo_text,
167                                     p_weight_modifier   => l_weight_modifier);
168                EXIT;
169             ELSE
170                l_current_algo_id := l_use_algo_id;
171             END IF;
172          END LOOP;
173       END IF;
174 
175       --at this point we should be guaranteed that the algo is in the cache, see if its valid
176       IF NOT b_algo_cache.EXISTS(p_algo_id) OR NOT b_algo_cache(p_algo_id).is_valid THEN
177          RAISE NO_DATA_FOUND;
178       END IF;
179 
180       --we have a valid algo cache entry, make the new column value using any necessary substitutions
181       REPLACE_SUBSTITUTION_TOKENS(b_algo_cache(p_algo_id).raw_algo_text,
182                                   p_table_owner,
183                                   p_table_name,
184                                   p_column_name,
185                                   x_new_column_value);
186       x_weight_modifier := b_algo_cache(p_algo_id).weight_modifier;
187 
188       -- Success
189       fnd_oam_debug.log(2, l_ctxt, 'EXIT');
190    EXCEPTION
191       WHEN NO_DATA_FOUND THEN
192          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
193          RAISE;
194       WHEN VALUE_ERROR THEN
195          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
196          RAISE;
197       WHEN OTHERS THEN
198          fnd_oam_debug.log(6, l_ctxt, 'Unexpected Error: (Code('||SQLCODE||'), Message("'||SQLERRM||'"))');
199          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
200          RAISE;
201    END;
202 
203    -- Public
204    PROCEDURE GET_DEFAULT_ALGO_FOR_DATATYPE(p_datatype   IN VARCHAR2,
205                                            x_algo_id    OUT NOCOPY NUMBER)
206    IS
207       l_ctxt            VARCHAR2(60) := PKG_NAME||'GET_DEFAULT_ALGO_FOR_DATATYPE';
208 
209       l_id              NUMBER;
210    BEGIN
211       fnd_oam_debug.log(2, l_ctxt, 'ENTER');
212 
213       --see if we've already queried this datatype
214       IF b_default_algo_cache.EXISTS(p_datatype) THEN
215          --if we cached the algo_id NULL, we cached failure
216          l_id := b_default_algo_cache(p_datatype);
217          IF l_id IS NULL THEN
218             RAISE NO_DATA_FOUND;
219          END IF;
220       ELSE
221          fnd_oam_debug.log(1, l_ctxt, 'Querying default for datatype "'||p_datatype||'"...');
222 
223          --do the query, automatically throws NO_DATA_FOUND/TOO_MANY_ROWS if less than or greater than one row
224          BEGIN
225             SELECT algo_id
226                INTO l_id
227                FROM fnd_oam_ds_algos_b
228                WHERE datatype = p_datatype
229                AND default_for_datatype_flag = FND_API.G_TRUE;
230 
231             --cache the result
232             fnd_oam_debug.log(1, l_ctxt, 'Found id: '||l_id);
233             b_default_algo_cache(p_datatype) := l_id;
234          EXCEPTION
235             WHEN OTHERS THEN
236                --cache failure
237                fnd_oam_debug.log(3, l_ctxt, 'Failed to find a default: (Code('||SQLCODE||'), Message("'||SQLERRM||'"))');
238                b_default_algo_cache(p_datatype) := NULL;
239                RAISE;
240          END;
241       END IF;
242 
243       x_algo_id := l_id;
244       fnd_oam_debug.log(2, l_ctxt, 'EXIT');
245    EXCEPTION
246       WHEN NO_DATA_FOUND THEN
247          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
248          RAISE;
249       WHEN TOO_MANY_ROWS THEN
250          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
251          RAISE;
252       WHEN OTHERS THEN
253          fnd_oam_debug.log(6, l_ctxt, 'Unexpected Error: (Code('||SQLCODE||'), Message("'||SQLERRM||'"))');
254          fnd_oam_debug.log(2, l_ctxt, 'EXIT');
255          RAISE;
256    END;
257 
258 
259   --PROCEDURES REQUIRED BY FNDLOADER
260 
261   procedure LOAD_ROW (
262       X_ALGO_ID             in NUMBER,
263       X_START_DATE          IN DATE,
264       X_END_DATE            IN DATE,
265       X_USE_ALGO_ID         IN NUMBER,
266       X_DEFAULT_FOR_DATATYPE_FLAG IN VARCHAR2,
267       X_DATATYPE            IN VARCHAR2,
268       X_ALGO_TEXT           IN VARCHAR2,
269       X_WEIGHT_MODIFIER     IN NUMBER,
270       X_OWNER               in VARCHAR2,
271         X_DISPLAY_NAME        IN VARCHAR2,
272       X_DESCRIPTION         IN VARCHAR2) IS
273   begin
274 
275      FND_OAM_DS_ALGOS_PKG.LOAD_ROW (
276        X_ALGO_ID => X_ALGO_ID,
277        X_START_DATE => X_START_DATE,
278        X_END_DATE => X_END_DATE,
279        X_USE_ALGO_ID => X_USE_ALGO_ID,
280        X_DEFAULT_FOR_DATATYPE_FLAG => X_DEFAULT_FOR_DATATYPE_FLAG,
281        X_DATATYPE => X_DATATYPE,
282        X_ALGO_TEXT => X_ALGO_TEXT,
283        X_WEIGHT_MODIFIER => X_WEIGHT_MODIFIER,
284        X_OWNER       => X_OWNER,
285        X_DISPLAY_NAME => X_DISPLAY_NAME,
286        X_DESCRIPTION => X_DESCRIPTION,
287        x_custom_mode => '',
288        X_LAST_UPDATE_DATE => '');
289 
290   end LOAD_ROW;
291 
292   procedure LOAD_ROW (
293       X_ALGO_ID             in NUMBER,
294       X_START_DATE          IN DATE,
295       X_END_DATE            IN DATE,
296       X_USE_ALGO_ID         IN NUMBER,
297       X_DEFAULT_FOR_DATATYPE_FLAG IN VARCHAR2,
298       X_DATATYPE            IN VARCHAR2,
299       X_ALGO_TEXT           IN VARCHAR2,
300       X_WEIGHT_MODIFIER     IN NUMBER,
301       X_OWNER               in VARCHAR2,
302         X_DISPLAY_NAME        IN VARCHAR2,
303       X_DESCRIPTION         IN VARCHAR2,
304       x_custom_mode         in varchar2,
305       X_LAST_UPDATE_DATE    in varchar2)
306     is
307       malgo_id number;
308       row_id varchar2(64);
309       f_luby    number;  -- entity owner in file
310       f_ludate  date;    -- entity update date in file
311       db_luby   number;  -- entity owner in db
312       db_ludate date;    -- entity update date in db
313     begin
314 
315       -- Translate owner to file_last_updated_by
316       f_luby := fnd_load_util.owner_id(x_owner);
317 
318       -- Translate char last_update_date to date
319       f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
320 
321       begin
322         -- check if this algorithm id already exists.
323         select algo_id, LAST_UPDATED_BY, LAST_UPDATE_DATE
324         into malgo_id, db_luby, db_ludate
325         from   fnd_oam_ds_algos_b
326     where  algo_id = to_number(X_ALGO_ID);
327 
328       if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
329                                   db_ludate, X_CUSTOM_MODE)) then
330         FND_OAM_DS_ALGOS_PKG.UPDATE_ROW (
331           X_ALGO_ID => malgo_id,
332           X_START_DATE => X_START_DATE,
333           X_END_DATE => X_END_DATE,
334           X_USE_ALGO_ID => X_USE_ALGO_ID,
335           X_DEFAULT_FOR_DATATYPE_FLAG => X_DEFAULT_FOR_DATATYPE_FLAG,
336           X_DATATYPE => X_DATATYPE,
337           X_ALGO_TEXT => X_ALGO_TEXT,
338           X_WEIGHT_MODIFIER => X_WEIGHT_MODIFIER,
339           X_DISPLAY_NAME => X_DISPLAY_NAME,
340           X_DESCRIPTION => X_DESCRIPTION,
341           X_LAST_UPDATED_BY => f_luby,
342           X_LAST_UPDATE_DATE => f_ludate,
343           X_LAST_UPDATE_LOGIN => 0 );
344 
345         end if;
346       exception
347         when NO_DATA_FOUND then
348 
349         FND_OAM_DS_ALGOS_PKG.INSERT_ROW (
350           X_ROWID => row_id,
351           X_ALGO_ID => X_ALGO_ID,
352           X_START_DATE => X_START_DATE,
353           X_END_DATE => X_END_DATE,
354           X_USE_ALGO_ID => X_USE_ALGO_ID,
355           X_DEFAULT_FOR_DATATYPE_FLAG => X_DEFAULT_FOR_DATATYPE_FLAG,
356           X_DATATYPE => X_DATATYPE,
357           X_ALGO_TEXT => X_ALGO_TEXT,
358           X_WEIGHT_MODIFIER => X_WEIGHT_MODIFIER,
359           X_DISPLAY_NAME => X_DISPLAY_NAME,
360           X_DESCRIPTION => X_DESCRIPTION,
361           X_CREATION_DATE => f_ludate,
362           X_CREATED_BY => f_luby,
363           X_LAST_UPDATE_DATE => f_ludate,
364           X_LAST_UPDATED_BY => f_luby,
365           X_LAST_UPDATE_LOGIN => 0 );
366     end;
367 
368   end LOAD_ROW;
369 
370   --TRANSLATE ROW
371 
372    procedure TRANSLATE_ROW (
373       X_ALGO_ID             in NUMBER,
374         X_DISPLAY_NAME        IN VARCHAR2,
375       X_DESCRIPTION         IN VARCHAR2,
376       X_OWNER               in  VARCHAR2)
377   is
378   begin
379 
380   FND_OAM_DS_ALGOS_PKG.translate_row(
381     X_ALGO_ID => X_ALGO_ID,
382     X_DISPLAY_NAME => X_DISPLAY_NAME,
383     X_DESCRIPTION => X_DESCRIPTION,
384     X_OWNER => X_OWNER,
385     X_CUSTOM_MODE => '',
386     X_LAST_UPDATE_DATE => '');
387 
388   end TRANSLATE_ROW;
389 
390   procedure TRANSLATE_ROW (
391       X_ALGO_ID             in NUMBER,
392         X_DISPLAY_NAME        IN VARCHAR2,
393       X_DESCRIPTION         IN VARCHAR2,
394       X_OWNER               in  VARCHAR2,
395       X_CUSTOM_MODE                   in        VARCHAR2,
396       X_LAST_UPDATE_DATE          in    VARCHAR2)
397   IS
398 
399       f_luby    number;  -- entity owner in file
400       f_ludate  date;    -- entity update date in file
401       db_luby   number;  -- entity owner in db
402       db_ludate date;    -- entity update date in db
403 
404   begin
405 
406     -- Translate owner to file_last_updated_by
407     f_luby := fnd_load_util.owner_id(x_owner);
408 
409     -- Translate char last_update_date to date
410     f_ludate := nvl(to_date(x_last_update_date, 'YYYY/MM/DD'), sysdate);
411 
412     begin
413       select LAST_UPDATED_BY, LAST_UPDATE_DATE
414       into db_luby, db_ludate
415       from fnd_oam_ds_algos_tl
416       where algo_id = to_number(X_ALGO_ID)
417       and LANGUAGE = userenv('LANG');
418 
419       if (fnd_load_util.upload_test(f_luby, f_ludate, db_luby,
420                                   db_ludate, X_CUSTOM_MODE)) then
421         update fnd_oam_ds_algos_tl set
422           display_name    = nvl(X_DISPLAY_NAME, display_name),
423           description         = nvl(X_DESCRIPTION, description),
424           source_lang         = userenv('LANG'),
425           last_update_date    = f_ludate,
426           last_updated_by     = f_luby,
427           last_update_login   = 0
428         where algo_id = to_number(X_ALGO_ID)
429           and userenv('LANG') in (language, source_lang);
430       end if;
431     exception
432       when no_data_found then
433         null;
434     end;
435 
436   end TRANSLATE_ROW;
437 
438 
439   --INSERT ROW
440   procedure INSERT_ROW (
441       X_ROWID               in out nocopy VARCHAR2,
442       X_ALGO_ID             in NUMBER,
443         X_DISPLAY_NAME        IN VARCHAR2,
444       X_DESCRIPTION         IN VARCHAR2,
445       X_START_DATE          IN DATE,
446       X_END_DATE            IN DATE,
447       X_USE_ALGO_ID         IN NUMBER,
448       X_DEFAULT_FOR_DATATYPE_FLAG IN VARCHAR2,
449       X_DATATYPE            IN VARCHAR2,
450       X_ALGO_TEXT           IN VARCHAR2,
451       X_WEIGHT_MODIFIER     IN NUMBER,
452       X_CREATED_BY          in NUMBER,
453       X_CREATION_DATE       in DATE,
454       X_LAST_UPDATED_BY     in NUMBER,
455       X_LAST_UPDATE_DATE    in DATE,
456       X_LAST_UPDATE_LOGIN   in NUMBER)
457  is
458   cursor C is select ROWID from FND_OAM_DS_ALGOS_B
459     where ALGO_ID = X_ALGO_ID;
460 begin
461   insert into FND_OAM_DS_ALGOS_B (
462         ALGO_ID,
463         START_DATE,
464         END_DATE,
465   USE_ALGO_ID,
466   DEFAULT_FOR_DATATYPE_FLAG,
467   DATATYPE,
468   ALGO_TEXT,
469   WEIGHT_MODIFIER,
470         CREATED_BY,
471         CREATION_DATE,
472         LAST_UPDATED_BY,
473         LAST_UPDATE_DATE,
474         LAST_UPDATE_LOGIN
475   ) values (
476         X_ALGO_ID,
477         X_START_DATE,
478         X_END_DATE,
479   X_USE_ALGO_ID,
480   X_DEFAULT_FOR_DATATYPE_FLAG,
481   X_DATATYPE,
482   X_ALGO_TEXT,
483   X_WEIGHT_MODIFIER,
484         X_CREATED_BY,
485         X_CREATION_DATE,
486         X_LAST_UPDATED_BY,
487         X_LAST_UPDATE_DATE,
488         X_LAST_UPDATE_LOGIN
489   );
490 
491   insert into FND_OAM_DS_ALGOS_TL (
492         ALGO_ID,
493         DISPLAY_NAME,
494         DESCRIPTION,
495         CREATED_BY,
496         CREATION_DATE,
497         LAST_UPDATED_BY,
498         LAST_UPDATE_DATE,
499         LAST_UPDATE_LOGIN,
500       LANGUAGE,
501       SOURCE_LANG
502   ) select
503         X_ALGO_ID,
504   X_DISPLAY_NAME,
505         X_DESCRIPTION,
506         X_CREATED_BY,
507         X_CREATION_DATE,
508         X_LAST_UPDATED_BY,
509         X_LAST_UPDATE_DATE,
510         X_LAST_UPDATE_LOGIN,
511       L.LANGUAGE_CODE,
512       userenv('LANG')
513   from FND_LANGUAGES L
514   where L.INSTALLED_FLAG in ('I', 'B')
515   and not exists
516     (select NULL
517     from FND_OAM_DS_ALGOS_TL T
518     where T.ALGO_ID = X_ALGO_ID
519     and T.LANGUAGE = L.LANGUAGE_CODE);
520 
521   open c;
522   fetch c into X_ROWID;
523   if (c%notfound) then
524     close c;
525     raise no_data_found;
526   end if;
527   close c;
528 
529 end INSERT_ROW;
530 
531    --LOCK ROW
532 
533   procedure LOCK_ROW (
534       X_ROWID               in out nocopy VARCHAR2,
535       X_ALGO_ID             in NUMBER,
536         X_DISPLAY_NAME        IN VARCHAR2,
537       X_DESCRIPTION         IN VARCHAR2,
538       X_START_DATE          IN DATE,
539       X_END_DATE            IN DATE,
540       X_USE_ALGO_ID         IN NUMBER,
541       X_DEFAULT_FOR_DATATYPE_FLAG IN VARCHAR2,
542       X_DATATYPE            IN VARCHAR2,
543       X_ALGO_TEXT           IN VARCHAR2,
544       X_WEIGHT_MODIFIER     IN NUMBER,
545       X_CREATED_BY          in NUMBER,
546       X_CREATION_DATE       in DATE,
547       X_LAST_UPDATED_BY     in NUMBER,
548       X_LAST_UPDATE_DATE    in DATE,
549       X_LAST_UPDATE_LOGIN   in NUMBER
550 ) is
551   cursor c is select
552         ALGO_ID,
553         START_DATE,
554         END_DATE,
555   USE_ALGO_ID,
556   DEFAULT_FOR_DATATYPE_FLAG,
557   DATATYPE,
558   ALGO_TEXT,
559   WEIGHT_MODIFIER,
560         CREATED_BY,
561         CREATION_DATE,
562         LAST_UPDATED_BY,
563         LAST_UPDATE_DATE,
564         LAST_UPDATE_LOGIN
565     from FND_OAM_DS_ALGOS_B
566     where ALGO_ID = X_ALGO_ID
567     for update of ALGO_ID nowait;
568   recinfo c%rowtype;
569 
570   cursor c1 is select
571       DISPLAY_NAME,
572       DESCRIPTION,
573       decode(LANGUAGE, userenv('LANG'), 'Y', 'N') BASELANG
574     from FND_OAM_DS_ALGOS_TL
575     where ALGO_ID = X_ALGO_ID
576     and userenv('LANG') in (LANGUAGE, SOURCE_LANG)
577     for update of ALGO_ID nowait;
578 begin
579   open c;
580   fetch c into recinfo;
581   if (c%notfound) then
582     close c;
583     fnd_message.set_name('FND', 'FORM_RECORD_DELETED');
584     app_exception.raise_exception;
585   end if;
586   close c;
587   if (    ((recinfo.START_DATE = X_START_DATE)
588            OR ((recinfo.START_DATE is null) AND (X_START_DATE is null)))
589       AND ((recinfo.END_DATE = X_END_DATE)
590            OR ((recinfo.END_DATE is null) AND (X_END_DATE is null)))
591       AND ((recinfo.USE_ALGO_ID = X_USE_ALGO_ID)
592            OR ((recinfo.USE_ALGO_ID is null) AND (X_USE_ALGO_ID is null)))
593       AND ((recinfo.DEFAULT_FOR_DATATYPE_FLAG = X_DEFAULT_FOR_DATATYPE_FLAG)
594            OR ((recinfo.DEFAULT_FOR_DATATYPE_FLAG is null) AND (X_DEFAULT_FOR_DATATYPE_FLAG is null)))
595       AND ((recinfo.DATATYPE = X_DATATYPE)
596            OR ((recinfo.DATATYPE is null) AND (X_DATATYPE is null)))
597       AND ((recinfo.ALGO_TEXT = X_ALGO_TEXT)
598            OR ((recinfo.ALGO_TEXT is null) AND (X_ALGO_TEXT is null)))
599       AND ((recinfo.WEIGHT_MODIFIER = X_WEIGHT_MODIFIER)
600            OR ((recinfo.WEIGHT_MODIFIER is null) AND (X_WEIGHT_MODIFIER is null)))
601   ) then
602     null;
603   else
604     fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
605     app_exception.raise_exception;
606   end if;
607 
608   for tlinfo in c1 loop
609     if (tlinfo.BASELANG = 'Y') then
610       if (    (tlinfo.DISPLAY_NAME = X_DISPLAY_NAME)
611           AND ((tlinfo.DESCRIPTION = X_DESCRIPTION)
612                OR ((tlinfo.DESCRIPTION is null) AND (X_DESCRIPTION is null)))
613       ) then
614         null;
615       else
616         fnd_message.set_name('FND', 'FORM_RECORD_CHANGED');
617         app_exception.raise_exception;
618       end if;
619     end if;
620   end loop;
621   return;
622 end LOCK_ROW;
623 
624 --UPDATE ROW
625 
626   procedure UPDATE_ROW (
627       X_ALGO_ID             in NUMBER,
628         X_DISPLAY_NAME        IN VARCHAR2,
629       X_DESCRIPTION         IN VARCHAR2,
630       X_START_DATE          IN DATE,
631       X_END_DATE            IN DATE,
632       X_USE_ALGO_ID         IN NUMBER,
633       X_DEFAULT_FOR_DATATYPE_FLAG IN VARCHAR2,
634       X_DATATYPE            IN VARCHAR2,
635       X_ALGO_TEXT           IN VARCHAR2,
636       X_WEIGHT_MODIFIER     IN NUMBER,
637       X_LAST_UPDATED_BY     in NUMBER,
638       X_LAST_UPDATE_DATE    in DATE,
639       X_LAST_UPDATE_LOGIN   in NUMBER
640 ) is
641 begin
642   update FND_OAM_DS_ALGOS_B set
643       START_DATE = X_START_DATE,
644       END_DATE = X_END_DATE,
645       USE_ALGO_ID = X_USE_ALGO_ID,
646       DEFAULT_FOR_DATATYPE_FLAG = X_DEFAULT_FOR_DATATYPE_FLAG,
647       DATATYPE = X_DATATYPE,
648       ALGO_TEXT = X_ALGO_TEXT,
649       WEIGHT_MODIFIER = X_WEIGHT_MODIFIER,
650       LAST_UPDATED_BY = X_LAST_UPDATED_BY,
651       LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
652       LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN
653   where ALGO_ID = X_ALGO_ID;
654 
655   if (sql%notfound) then
656     raise no_data_found;
657   end if;
658 
659   update FND_OAM_DS_ALGOS_TL set
660     DISPLAY_NAME = X_DISPLAY_NAME,
661     DESCRIPTION = X_DESCRIPTION,
662     LAST_UPDATED_BY = X_LAST_UPDATED_BY,
663     LAST_UPDATE_DATE = X_LAST_UPDATE_DATE,
664     LAST_UPDATE_LOGIN = X_LAST_UPDATE_LOGIN,
665     SOURCE_LANG = userenv('LANG')
666   where ALGO_ID = X_ALGO_ID
667   and userenv('LANG') in (LANGUAGE, SOURCE_LANG);
668 
669   if (sql%notfound) then
670     raise no_data_found;
671   end if;
672 end UPDATE_ROW;
673 
674 
675   --DELETE ROW
676 
677   procedure DELETE_ROW (
678       X_ALGO_ID           in NUMBER
679 ) is
680 begin
681   delete from FND_OAM_DS_ALGOS_TL
682   where ALGO_ID = X_ALGO_ID;
683 
684   if (sql%notfound) then
685     raise no_data_found;
686   end if;
687 
688   delete from FND_OAM_DS_ALGOS_B
689   where ALGO_ID = X_ALGO_ID;
690 
691   if (sql%notfound) then
692     raise no_data_found;
693   end if;
694 end DELETE_ROW;
695 
696 
697   --ADD LANGUAGE
698 
699 procedure ADD_LANGUAGE
700 is
701 begin
702   delete from FND_OAM_DS_ALGOS_TL T
703   where not exists
704     (select NULL
705     from FND_OAM_DS_ALGOS_B B
706     where B.ALGO_ID = T.ALGO_ID
707     );
708 
709   update FND_OAM_DS_ALGOS_TL T set (
710       DISPLAY_NAME,
711       DESCRIPTION
712     ) = (select
713       B.DISPLAY_NAME,
714       B.DESCRIPTION
715     from FND_OAM_DS_ALGOS_TL B
716     where B.ALGO_ID = T.ALGO_ID
717     and B.LANGUAGE = T.SOURCE_LANG)
718   where (
719       T.ALGO_ID,
720       T.LANGUAGE
721   ) in (select
722       SUBT.ALGO_ID,
723       SUBT.LANGUAGE
724     from FND_OAM_DS_ALGOS_TL SUBB, FND_OAM_DS_ALGOS_TL SUBT
725     where SUBB.ALGO_ID = SUBT.ALGO_ID
726     and SUBB.LANGUAGE = SUBT.SOURCE_LANG
727     and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
728       or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
729       or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
730       or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
731   ));
732 
733   insert into FND_OAM_DS_ALGOS_TL (
734     ALGO_ID,
735     DISPLAY_NAME,
736     DESCRIPTION,
737     CREATED_BY,
738     CREATION_DATE,
739     LAST_UPDATED_BY,
740     LAST_UPDATE_DATE,
741     LAST_UPDATE_LOGIN,
742     LANGUAGE,
743     SOURCE_LANG
744   ) select /*+ ORDERED */
745     B.ALGO_ID,
746     B.DISPLAY_NAME,
747     B.DESCRIPTION,
748     B.CREATED_BY,
749     B.CREATION_DATE,
750     B.LAST_UPDATED_BY,
751     B.LAST_UPDATE_DATE,
752     B.LAST_UPDATE_LOGIN,
753     L.LANGUAGE_CODE,
754     B.SOURCE_LANG
755   from FND_OAM_DS_ALGOS_TL B, FND_LANGUAGES L
756   where L.INSTALLED_FLAG in ('I', 'B')
757   and B.LANGUAGE = userenv('LANG')
758   and not exists
759     (select NULL
760     from FND_OAM_DS_ALGOS_TL T
761     where T.ALGO_ID = B.ALGO_ID
762     and T.LANGUAGE = L.LANGUAGE_CODE);
763 end ADD_LANGUAGE;
764 
765 
766   --TRANSLATE ROW
767 
768   procedure TRANSLATE_ROW
769   (
770       x_ALGO_ID             in NUMBER,
771       x_DISPLAY_NAME        in varchar2,
772       X_LAST_UPDATED_BY     in NUMBER,
773       X_LAST_UPDATE_DATE    in DATE,
774       X_LAST_UPDATE_LOGIN   in NUMBER)
775 is
776 begin
777 
778 UPDATE FND_OAM_DS_ALGOS_TL SET
779   DISPLAY_NAME  = nvl(x_DISPLAY_NAME,DISPLAY_NAME),
780   last_update_date        = nvl(x_last_update_date,sysdate),
781   last_updated_by         = x_last_updated_by,
782   last_update_login       = 0,
783   source_lang             = userenv('LANG')
784 WHERE ALGO_ID      = x_ALGO_ID
785 AND userenv('LANG') in (LANGUAGE,SOURCE_LANG);
786 
787   IF (sql%notfound) THEN
788     raise no_data_found;
789   END IF;
790 
791 end TRANSLATE_ROW;
792  --END OF PROCEDURES REQUIRED BY FNDLOADER.
793 
794 END FND_OAM_DS_ALGOS_PKG;