1 package body WF_ACTIVITIES_PKG as
2 /* $Header: wfactb.pls 120.3 2006/08/24 06:59:16 hgandiko ship $ */
3 procedure INSERT_ROW (
4 X_ROWID in out nocopy VARCHAR2,
5 X_ITEM_TYPE in VARCHAR2,
6 X_NAME in VARCHAR2,
7 X_VERSION in NUMBER,
8 X_TYPE in VARCHAR2,
9 X_RERUN in VARCHAR2,
10 X_EXPAND_ROLE in VARCHAR2,
11 X_PROTECT_LEVEL in NUMBER,
12 X_CUSTOM_LEVEL in NUMBER,
13 X_BEGIN_DATE in DATE,
14 X_END_DATE in DATE,
15 X_FUNCTION in VARCHAR2,
16 X_FUNCTION_TYPE in VARCHAR2,
17 X_RESULT_TYPE in VARCHAR2,
18 X_COST in NUMBER,
19 X_READ_ROLE in VARCHAR2,
20 X_WRITE_ROLE in VARCHAR2,
21 X_EXECUTE_ROLE in VARCHAR2,
22 X_ICON_NAME in VARCHAR2,
23 X_MESSAGE in VARCHAR2,
24 X_ERROR_PROCESS in VARCHAR2,
25 X_DISPLAY_NAME in VARCHAR2,
26 X_DESCRIPTION in VARCHAR2,
27 X_ERROR_ITEM_TYPE in VARCHAR2,
28 X_RUNNABLE_FLAG in VARCHAR2,
29 X_EVENT_FILTER in VARCHAR2 ,
30 X_EVENT_TYPE in VARCHAR2
31 ) is
32 cursor C is select ROWID from WF_ACTIVITIES
33 where ITEM_TYPE = X_ITEM_TYPE
34 and NAME = X_NAME
35 and VERSION = X_VERSION
36 ;
37 old_version number default '';
38 dummy number;
39 begin
40 insert into WF_ACTIVITIES (
41 ITEM_TYPE,
42 NAME,
43 VERSION,
44 TYPE,
45 RERUN,
46 EXPAND_ROLE,
47 PROTECT_LEVEL,
48 CUSTOM_LEVEL,
49 BEGIN_DATE,
50 END_DATE,
51 FUNCTION,
52 FUNCTION_TYPE,
53 RESULT_TYPE,
54 COST,
55 READ_ROLE,
56 WRITE_ROLE,
57 EXECUTE_ROLE,
58 ICON_NAME,
59 MESSAGE,
60 ERROR_PROCESS ,
61 ERROR_ITEM_TYPE,
62 RUNNABLE_FLAG,
63 EVENT_NAME,
64 DIRECTION
65 ) values (
66 X_ITEM_TYPE,
67 X_NAME,
68 X_VERSION,
69 X_TYPE,
70 X_RERUN,
71 X_EXPAND_ROLE,
72 X_PROTECT_LEVEL,
73 X_CUSTOM_LEVEL,
74 X_BEGIN_DATE,
75 X_END_DATE,
76 X_FUNCTION,
77 X_FUNCTION_TYPE,
78 X_RESULT_TYPE,
79 X_COST,
80 X_READ_ROLE,
81 X_WRITE_ROLE,
82 X_EXECUTE_ROLE,
83 X_ICON_NAME,
84 X_MESSAGE,
85 X_ERROR_PROCESS,
86 X_ERROR_ITEM_TYPE,
87 X_RUNNABLE_FLAG,
88 X_EVENT_FILTER,
89 X_EVENT_TYPE
90 );
91
92 -- *** VERSION CUSTOMIZATION
93 -- Insert translations. Default the translations for all but the
94 -- current language from a previous version of this activity, if one
95 -- is available.
96 -- Note: Use _VL instead of base table to prevent _tl integrity errors
97 -- from propagating.
98 select max(WA.VERSION)
99 into old_version
100 from WF_ACTIVITIES_VL WA
101 where WA.ITEM_TYPE = X_ITEM_TYPE
102 and WA.NAME = X_NAME
103 and WA.VERSION < X_VERSION;
104
105 if (old_version is not null) then
106 insert into WF_ACTIVITIES_TL (
107 ITEM_TYPE,
108 NAME,
109 VERSION,
110 DISPLAY_NAME,
111 PROTECT_LEVEL,
112 CUSTOM_LEVEL,
113 DESCRIPTION,
114 LANGUAGE,
115 SOURCE_LANG
116 ) select
117 X_ITEM_TYPE,
118 X_NAME,
119 X_VERSION,
120 decode(L.CODE,
121 userenv('LANG'), X_DISPLAY_NAME,
122 OLD.DISPLAY_NAME),
123 X_PROTECT_LEVEL,
124 X_CUSTOM_LEVEL,
125 decode(L.CODE,
126 userenv('LANG'), X_DESCRIPTION,
127 OLD.DESCRIPTION),
128 L.CODE,
129 decode(L.CODE,
130 userenv('LANG'), L.CODE,
131 OLD.SOURCE_LANG)
132 from WF_LANGUAGES L, WF_ACTIVITIES_TL OLD
133 where L.INSTALLED_FLAG = 'Y'
134 and OLD.ITEM_TYPE = X_ITEM_TYPE
135 and OLD.NAME = X_NAME
136 and OLD.VERSION = old_version
137 and OLD.LANGUAGE = L.CODE
138 and not exists
139 (select NULL
140 from WF_ACTIVITIES_TL T
141 where T.ITEM_TYPE = X_ITEM_TYPE
142 and T.NAME = X_NAME
143 and T.VERSION = X_VERSION
144 and T.LANGUAGE = L.CODE);
145 else
146 -- No other versions, default translations for all languages from
147 -- the current language.
148 insert into WF_ACTIVITIES_TL (
149 ITEM_TYPE,
150 NAME,
151 VERSION,
152 DISPLAY_NAME,
153 PROTECT_LEVEL,
154 CUSTOM_LEVEL,
155 DESCRIPTION,
156 LANGUAGE,
157 SOURCE_LANG
158 ) select
159 X_ITEM_TYPE,
160 X_NAME,
161 X_VERSION,
162 X_DISPLAY_NAME,
163 X_PROTECT_LEVEL,
164 X_CUSTOM_LEVEL,
165 X_DESCRIPTION,
166 L.CODE,
167 userenv('LANG')
168 from WF_LANGUAGES L
169 where L.INSTALLED_FLAG = 'Y'
170 and not exists
171 (select NULL
172 from WF_ACTIVITIES_TL T
173 where T.ITEM_TYPE = X_ITEM_TYPE
174 and T.NAME = X_NAME
175 and T.VERSION = X_VERSION
176 and T.LANGUAGE = L.CODE);
177
178 end if;
179
180 -- *** VERSION CUSTOMIZATION
181 -- Check rows just inserted for duplicate display_names among activities
182 -- within this itemtype over all versions active during the time
183 -- range of the version being added.
184 -- It is not sufficient to rely on WF_ACTIVITIES_TL_U2 unique index,
185 -- because versions may mask some duplicates.
186 begin
187 select /*+ leading(NEW,NEWTL,OLDTL,OLD) use_nl(NEWTL,OLDTL,OLD) */
188 OLD.NAME||':'||OLDTL.LANGUAGE||':'||OLDTL.DISPLAY_NAME
189 into Wf_Load.logbuf
190 from WF_ACTIVITIES NEW, WF_ACTIVITIES OLD,
191 WF_ACTIVITIES_TL NEWTL, WF_ACTIVITIES_TL OLDTL
192 where NEW.ITEM_TYPE = NEWTL.ITEM_TYPE
193 and NEW.NAME = NEWTL.NAME
194 and NEW.VERSION = NEWTL.VERSION
195 and OLD.ITEM_TYPE = OLDTL.ITEM_TYPE
196 and OLD.NAME = OLDTL.NAME
197 and OLD.VERSION = OLDTL.VERSION
198 and NEW.ITEM_TYPE = x_item_type
199 and NEW.NAME = x_name
200 and NEW.VERSION = x_version
201 and NEW.BEGIN_DATE < nvl(OLD.END_DATE, NEW.BEGIN_DATE+1)
202 and nvl(NEW.END_DATE, OLD.BEGIN_DATE+1) > OLD.BEGIN_DATE
203 and OLDTL.DISPLAY_NAME = NEWTL.DISPLAY_NAME
204 and OLD.ITEM_TYPE = NEW.ITEM_TYPE
205 and OLDTL.LANGUAGE = NEWTL.LANGUAGE
206 and OLDTL.ROWID <> NEWTL.ROWID
207 and rownum < 2;
208
209 exception
210 when no_data_found then
211 null;
212 -- No bad rows exist. Joy.
213 end;
214
215 open c;
216 fetch c into X_ROWID;
217 if (c%notfound) then
218 close c;
219 raise no_data_found;
220 end if;
221 close c;
222
223 exception
224 when others then
225 wf_core.context('Wf_Activities_Pkg', 'Insert_Row', x_item_type,
226 x_name, to_char(x_version));
227 raise;
228 end INSERT_ROW;
229
230 procedure LOCK_ROW (
231 X_ITEM_TYPE in VARCHAR2,
232 X_NAME in VARCHAR2,
233 X_VERSION in NUMBER,
234 X_TYPE in VARCHAR2,
235 X_RERUN in VARCHAR2,
236 X_EXPAND_ROLE in VARCHAR2,
237 X_PROTECT_LEVEL in NUMBER,
238 X_CUSTOM_LEVEL in NUMBER,
239 X_BEGIN_DATE in DATE,
240 X_END_DATE in DATE,
241 X_FUNCTION in VARCHAR2,
242 X_RESULT_TYPE in VARCHAR2,
243 X_COST in NUMBER,
244 X_READ_ROLE in VARCHAR2,
245 X_WRITE_ROLE in VARCHAR2,
246 X_EXECUTE_ROLE in VARCHAR2,
247 X_ICON_NAME in VARCHAR2,
248 X_MESSAGE in VARCHAR2,
249 X_ERROR_PROCESS in VARCHAR2,
250 X_DISPLAY_NAME in VARCHAR2,
251 X_DESCRIPTION in VARCHAR2
252 ) is
253 cursor c is select
254 TYPE,
255 RERUN,
256 EXPAND_ROLE,
257 PROTECT_LEVEL,
258 CUSTOM_LEVEL,
259 BEGIN_DATE,
260 END_DATE,
261 FUNCTION,
262 RESULT_TYPE,
263 COST,
264 READ_ROLE,
265 WRITE_ROLE,
266 EXECUTE_ROLE,
267 ICON_NAME,
268 MESSAGE,
269 ERROR_PROCESS
270 from WF_ACTIVITIES
271 where ITEM_TYPE = X_ITEM_TYPE
272 and NAME = X_NAME
273 and VERSION = X_VERSION
274 for update of ITEM_TYPE nowait;
275 recinfo c%rowtype;
276
277 cursor c1 is select
278 DISPLAY_NAME,
279 DESCRIPTION
280 from WF_ACTIVITIES_TL
281 where ITEM_TYPE = X_ITEM_TYPE
282 and NAME = X_NAME
283 and VERSION = X_VERSION
284 and LANGUAGE = userenv('LANG')
285 for update of ITEM_TYPE nowait;
286 tlinfo c1%rowtype;
287
288 begin
289 open c;
290 fetch c into recinfo;
291 if (c%notfound) then
292 close c;
293 wf_core.raise('WF_RECORD_DELETED');
294 end if;
295 close c;
296 if ( (recinfo.TYPE = X_TYPE)
297 AND (recinfo.RERUN = X_RERUN)
298 AND (recinfo.EXPAND_ROLE = X_EXPAND_ROLE)
299 AND (recinfo.PROTECT_LEVEL = X_PROTECT_LEVEL)
300 AND (recinfo.CUSTOM_LEVEL = X_CUSTOM_LEVEL)
301 AND (recinfo.BEGIN_DATE = X_BEGIN_DATE)
302 AND ((recinfo.END_DATE = X_END_DATE)
303 OR ((recinfo.END_DATE is null) AND (X_END_DATE is null)))
304 AND ((recinfo.FUNCTION = X_FUNCTION)
305 OR ((recinfo.FUNCTION is null) AND (X_FUNCTION is null)))
306 AND ((recinfo.RESULT_TYPE = X_RESULT_TYPE)
307 OR ((recinfo.RESULT_TYPE is null) AND (X_RESULT_TYPE is null)))
308 AND ((recinfo.COST = X_COST)
309 OR ((recinfo.COST is null) AND (X_COST is null)))
310 AND ((recinfo.READ_ROLE = X_READ_ROLE)
311 OR ((recinfo.READ_ROLE is null) AND (X_READ_ROLE is null)))
312 AND ((recinfo.WRITE_ROLE = X_WRITE_ROLE)
313 OR ((recinfo.WRITE_ROLE is null) AND (X_WRITE_ROLE is null)))
314 AND ((recinfo.EXECUTE_ROLE = X_EXECUTE_ROLE)
315 OR ((recinfo.EXECUTE_ROLE is null) AND (X_EXECUTE_ROLE is null)))
316 AND ((recinfo.ICON_NAME = X_ICON_NAME)
317 OR ((recinfo.ICON_NAME is null) AND (X_ICON_NAME is null)))
318 AND ((recinfo.MESSAGE = X_MESSAGE)
319 OR ((recinfo.MESSAGE is null) AND (X_MESSAGE is null)))
320 AND ((recinfo.ERROR_PROCESS = X_ERROR_PROCESS)
321 OR ((recinfo.ERROR_PROCESS is null) AND (X_ERROR_PROCESS is null)))
322 ) then
323 null;
324 else
325 wf_core.raise('WF_RECORD_CHANGED');
326 end if;
327
328 open c1;
329 fetch c1 into tlinfo;
330 if (c1%notfound) then
331 close c1;
332 return;
333 end if;
334 close c1;
335
336 if ( (tlinfo.DISPLAY_NAME = X_DISPLAY_NAME)
337 AND ((tlinfo.DESCRIPTION = X_DESCRIPTION)
338 OR ((tlinfo.DESCRIPTION is null) AND (X_DESCRIPTION is null)))
339 ) then
340 null;
341 else
342 wf_core.raise('WF_RECORD_CHANGED');
343 end if;
344 return;
345
346 exception
347 when others then
348 wf_core.context('Wf_Activities_Pkg', 'Lock_Row', x_item_type,
349 x_name, to_char(x_version));
350 raise;
351 end LOCK_ROW;
352
353 procedure UPDATE_ROW (
354 X_ITEM_TYPE in VARCHAR2,
355 X_NAME in VARCHAR2,
356 X_VERSION in NUMBER,
357 X_TYPE in VARCHAR2,
358 X_RERUN in VARCHAR2,
359 X_EXPAND_ROLE in VARCHAR2,
360 X_PROTECT_LEVEL in NUMBER,
361 X_CUSTOM_LEVEL in NUMBER,
362 X_BEGIN_DATE in DATE,
363 X_END_DATE in DATE,
364 X_FUNCTION in VARCHAR2,
365 X_RESULT_TYPE in VARCHAR2,
366 X_COST in NUMBER,
367 X_READ_ROLE in VARCHAR2,
368 X_WRITE_ROLE in VARCHAR2,
369 X_EXECUTE_ROLE in VARCHAR2,
370 X_ICON_NAME in VARCHAR2,
371 X_MESSAGE in VARCHAR2,
372 X_ERROR_PROCESS in VARCHAR2,
373 X_DISPLAY_NAME in VARCHAR2,
374 X_DESCRIPTION in VARCHAR2
375 ) is
376 begin
377 update WF_ACTIVITIES set
378 TYPE = X_TYPE,
379 RERUN = X_RERUN,
380 EXPAND_ROLE = X_EXPAND_ROLE,
381 PROTECT_LEVEL = X_PROTECT_LEVEL,
382 CUSTOM_LEVEL = X_CUSTOM_LEVEL,
383 BEGIN_DATE = X_BEGIN_DATE,
384 END_DATE = X_END_DATE,
385 FUNCTION = X_FUNCTION,
386 RESULT_TYPE = X_RESULT_TYPE,
387 COST = X_COST,
388 READ_ROLE = X_READ_ROLE,
389 WRITE_ROLE = X_WRITE_ROLE,
390 EXECUTE_ROLE = X_EXECUTE_ROLE,
391 ICON_NAME = X_ICON_NAME,
392 MESSAGE = X_MESSAGE,
393 ERROR_PROCESS = X_ERROR_PROCESS
394 where ITEM_TYPE = X_ITEM_TYPE
395 and NAME = X_NAME
396 and VERSION = X_VERSION;
397
398 if (sql%notfound) then
399 raise no_data_found;
400 end if;
401
402 update WF_ACTIVITIES_TL set
403 DISPLAY_NAME = X_DISPLAY_NAME,
404 DESCRIPTION = X_DESCRIPTION,
405 SOURCE_LANG = userenv('LANG')
406 where ITEM_TYPE = X_ITEM_TYPE
407 and NAME = X_NAME
408 and VERSION = X_VERSION
409 and userenv('LANG') in (LANGUAGE, SOURCE_LANG);
410
411 if (sql%notfound) then
412 raise no_data_found;
413 end if;
414
415 exception
416 when others then
417 wf_core.context('Wf_Activities_Pkg', 'Update_Row', x_item_type,
418 x_name, to_char(x_version));
419 raise;
420 end UPDATE_ROW;
421
422 procedure DELETE_ROW (
423 X_ITEM_TYPE in VARCHAR2,
424 X_NAME in VARCHAR2,
425 X_VERSION in NUMBER
426 ) is
427 begin
428 delete from WF_ACTIVITIES_TL
429 where ITEM_TYPE = X_ITEM_TYPE
430 and NAME = X_NAME
431 and VERSION = X_VERSION;
432
433 if (sql%notfound) then
434 raise no_data_found;
435 end if;
436
437 delete from WF_ACTIVITIES
438 where ITEM_TYPE = X_ITEM_TYPE
439 and NAME = X_NAME
440 and VERSION = X_VERSION;
441
442 if (sql%notfound) then
443 raise no_data_found;
444 end if;
445
446 exception
447 when others then
448 wf_core.context('Wf_Activities_Pkg', 'Delete_Row', x_item_type,
449 x_name, to_char(x_version));
450 raise;
451 end DELETE_ROW;
452
453 procedure ADD_LANGUAGE
454 is
455 begin
456 /* Mar/19/03 requested by Ric Ginsberg */
457 /* The following delete and update statements are commented out */
458 /* as a quick workaround to fix the time-consuming table handler issue */
459 /* Eventually we'll need to turn them into a separate fix_language procedure */
460 /*
461
462 delete from WF_ACTIVITIES_TL T
463 where not exists
464 (select NULL
465 from WF_ACTIVITIES B
466 where B.ITEM_TYPE = T.ITEM_TYPE
467 and B.NAME = T.NAME
468 and B.VERSION = T.VERSION
469 );
470
471 update WF_ACTIVITIES_TL T set (
472 DISPLAY_NAME,
473 DESCRIPTION
474 ) = (select
475 B.DISPLAY_NAME,
476 B.DESCRIPTION
477 from WF_ACTIVITIES_TL B
478 where B.ITEM_TYPE = T.ITEM_TYPE
479 and B.NAME = T.NAME
480 and B.VERSION = T.VERSION
481 and B.LANGUAGE = T.SOURCE_LANG)
482 where (
483 T.ITEM_TYPE,
484 T.NAME,
485 T.VERSION,
486 T.LANGUAGE
487 ) in (select
488 SUBT.ITEM_TYPE,
489 SUBT.NAME,
490 SUBT.VERSION,
491 SUBT.LANGUAGE
492 from WF_ACTIVITIES_TL SUBB, WF_ACTIVITIES_TL SUBT
496 and SUBB.LANGUAGE = SUBT.SOURCE_LANG
493 where SUBB.ITEM_TYPE = SUBT.ITEM_TYPE
494 and SUBB.NAME = SUBT.NAME
495 and SUBB.VERSION = SUBT.VERSION
497 and (SUBB.DISPLAY_NAME <> SUBT.DISPLAY_NAME
498 or SUBB.DESCRIPTION <> SUBT.DESCRIPTION
499 or (SUBB.DESCRIPTION is null and SUBT.DESCRIPTION is not null)
500 or (SUBB.DESCRIPTION is not null and SUBT.DESCRIPTION is null)
501 ));
502 */
503
504 insert /*+ append parallel */ into WF_ACTIVITIES_TL (
505 ITEM_TYPE,
506 NAME,
507 VERSION,
508 DISPLAY_NAME,
509 PROTECT_LEVEL,
510 CUSTOM_LEVEL,
511 DESCRIPTION,
512 LANGUAGE,
513 SOURCE_LANG
514 ) select
515 B.ITEM_TYPE,
516 B.NAME,
517 B.VERSION,
518 B.DISPLAY_NAME,
519 B.PROTECT_LEVEL,
520 B.CUSTOM_LEVEL,
521 B.DESCRIPTION,
522 L.CODE,
523 B.SOURCE_LANG
524 from WF_ACTIVITIES_TL B, WF_LANGUAGES L
525 where L.INSTALLED_FLAG = 'Y'
526 and B.LANGUAGE = userenv('LANG')
527 and (B.ITEM_TYPE , b.name, B.VERSION , l.code) NOT IN
528 (select /*+ hash_aj index_ffs(T,WF_ACTIVITIES_TL_PK) */
529 T.ITEM_TYPE , T.NAME , T.VERSION ,T.LANGUAGE from WF_ACTIVITIES_TL T );
530 end ADD_LANGUAGE;
531
532 end WF_ACTIVITIES_PKG;