1 PACKAGE BODY cz_model_migration_pvt AS
2 /* $Header: czmdlmgb.pls 120.19 2007/11/29 12:58:12 kdande ship $ */
3
4 G_PKG_NAME CONSTANT VARCHAR2(30) := 'cz_model_migration_pvt';
5
6 BOM_ITEM_TYPE_MODEL CONSTANT NUMBER := 1;
7 PS_NODE_TYPE_REFERENCE CONSTANT NUMBER := 263;
8
9 MODEL_TYPE_NORMAL CONSTANT INTEGER := 0;
10 MODEL_TYPE_ABNORMAL CONSTANT INTEGER := 1;
11 MODEL_TYPE_NAME_ERR CONSTANT INTEGER := 2;
12
13 CP_RETCODE_SUCCESS CONSTANT INTEGER := 0;
14 CP_RETCODE_WARNING CONSTANT INTEGER := 1;
15 CP_RETCODE_FAILURE CONSTANT INTEGER := 2;
16
17 m_commit_size INTEGER;
18
19 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
20 TYPE num_tbl_type_index_vc2 IS TABLE OF NUMBER INDEX BY VARCHAR2(15);
21
22 procedure log_msg(p_caller IN VARCHAR2
23 ,p_ndebug IN NUMBER
24 ,p_msg IN VARCHAR2
25 ,p_level IN NUMBER);
26
27 ---------------------------------------------------------------------------------------
28
29 /*
30 * Public API for Model Migration.
31 * @param p_request_id This is the CZ_MODEL_PUBLICATIONS, MIGRATION_GROUP_ID of the migration request.
32 * Migration request is created by Developer and contains the list of all models selected
33 * for Migration from the source's Configurator Repository, target Instance name and
34 * target Repository Folder.
35 * @param p_userid Standard parameters required for locking. Represent calling user.
36 * @param p_respid Standard parameters required for locking. Represent calling responsibility.
37 * @param p_applid Standard parameters required for locking. Represent calling application.
38 * @param p_run_id Number identifying the session. If left NULL, the API will generate the number and
39 * return it in x_run_id.
40 * @param x_run_id Output parameter containing internally generated session identifier if p_run_id
41 * was NULL, otherwise equal to p_run_id.
42 */
43
44 PROCEDURE migrate_models(p_request_id IN NUMBER,
45 p_user_id IN NUMBER,
46 p_resp_id IN NUMBER,
47 p_appl_id IN NUMBER,
48 p_run_id IN NUMBER,
49 x_run_id OUT NOCOPY NUMBER,
50 x_status OUT NOCOPY VARCHAR2
51 ) IS
52
53 l_api_name CONSTANT VARCHAR2(30) := 'migrate_models';
54 l_status VARCHAR2(3);
55 l_errbuf VARCHAR2(4000);
56 l_publication_id NUMBER;
57 BEGIN
58
59 fnd_global.apps_initialize(p_user_id, p_resp_id, p_appl_id);
60 x_run_id := p_run_id;
61
62 IF(x_run_id IS NULL)THEN
63 SELECT cz_xfr_run_infos_s.NEXTVAL INTO x_run_id FROM DUAL;
64 END IF;
65
66 x_status := FND_API.G_RET_STS_SUCCESS;
67
68 FOR c_pub IN (SELECT publication_id FROM cz_model_publications
69 WHERE migration_group_id = p_request_id AND deleted_flag = '0')LOOP
70
71 cz_pb_mgr.publish_model(c_pub.publication_id, x_run_id, l_status);
72
73 IF l_status <> 'OK' THEN x_status := FND_API.G_RET_STS_ERROR; END IF;
74 END LOOP;
75 EXCEPTION
76 WHEN OTHERS THEN
77 x_status := FND_API.G_RET_STS_ERROR;
78 l_errbuf := SQLERRM;
79 cz_utils.log_report(G_PKG_NAME, l_api_name, null, l_errbuf, fnd_log.LEVEL_UNEXPECTED);
80 END;
81 ---------------------------------------------------------------------------------------
82 /*
83 * Migrate Models concurrent procedure.
84 * @param errbuf Standard Oracle Concurrent Program output parameters.
85 * @param retcode Standard Oracle Concurrent Program output parameters.
86 * @param p_request_id This is the CZ_MODEL_PUBLICATIONS, MIGRATION_GROUP_ID of the migration request.
87 * Migration request is created by Developer and contains the list of all models selected
88 * for Migration from the source's Configurator Repository, target Instance name and
89 * target Repository Folder.
90 */
91
92 PROCEDURE migrate_models_cp(errbuf OUT NOCOPY VARCHAR2,
93 retcode OUT NOCOPY NUMBER,
94 p_request_id IN NUMBER
95 ) IS
96 l_status VARCHAR2(3);
97 l_publication_id NUMBER;
98 l_run_id NUMBER := 0;
99 l_mig_group_found BOOLEAN :=FALSE;
100 l_api_name CONSTANT VARCHAR2(30) := 'migrate_models_cp';
101 l_ndebug PLS_INTEGER:=1;
102
103 BEGIN
104
105 retcode:=0;
106 cz_pb_mgr.GLOBAL_EXPORT_RETCODE := 0;
107
108 FOR c_pub IN (SELECT publication_id FROM cz_model_publications
109 WHERE migration_group_id = p_request_id AND deleted_flag = '0')LOOP
110
111 l_mig_group_found :=TRUE;
112 cz_pb_mgr.publish_model(c_pub.publication_id, l_run_id, l_status);
113
114 errbuf := NULL;
115 IF(cz_pb_mgr.GLOBAL_EXPORT_RETCODE = 1)THEN
116
117 errbuf := CZ_UTILS.GET_TEXT('CZ_MM_WARNING');
118
119 ELSIF(cz_pb_mgr.GLOBAL_EXPORT_RETCODE = 2) THEN
120
121 errbuf := CZ_UTILS.GET_TEXT('CZ_MM_FAILURE');
122 END IF;
123 END LOOP;
124
125 IF NOT l_mig_group_found THEN
126 errbuf := cz_utils.get_text('CZ_INVALID_MIGR_GROUP_NUMBER', 'MIGRGRP', p_request_id);
127 log_msg(l_api_name, l_ndebug, errbuf , FND_LOG.LEVEL_PROCEDURE);
128 raise_application_error('-20020', 'INVALID_MIGRATION_GROUP');
129 END IF;
130
131 retcode := cz_pb_mgr.GLOBAL_EXPORT_RETCODE;
132
133 EXCEPTION
134 WHEN OTHERS THEN
135 retcode := 2;
136 errbuf := CZ_UTILS.GET_TEXT('CZ_MM_UNEXPECTED');
137 END;
138 ---------------------------------------------------------------------------------------
139 /*
140 * Procedure for persistent id(s) allocation in migrated models.
141 * @param p_model_id devl_project_id of the model.
142 * @param x_new_record_id Candidate for the new id.
143 */
144
145 PROCEDURE allocate_persistent_id(p_model_id IN NUMBER,
146 x_new_record_id IN OUT NOCOPY NUMBER
147 ) IS
148 PRAGMA AUTONOMOUS_TRANSACTION;
149 BEGIN
150 UPDATE CZ_PERSISTENT_REC_IDS SET max_persistent_rec_id = max_persistent_rec_id + 1
151 WHERE devl_project_id= (select devl_project_id from cz_devl_projects
152 where deleted_flag = '0' and devl_project_id=p_model_id
153 AND post_migr_change_flag <> 'L') and deleted_flag=0
154 --If no record returned, the value of the variable will not change.
155 RETURNING max_persistent_rec_id INTO x_new_record_id;
156 COMMIT;
157 END;
158 --------------------------------------------------------------------------------
159 --------------------------- Configuration Upgrade ----------------------------
160 --------------------------------------------------------------------------------
161 procedure log_msg(p_caller IN VARCHAR2
162 ,p_ndebug IN NUMBER
163 ,p_msg IN VARCHAR2
164 ,p_level IN NUMBER)
165 IS
166 BEGIN
167 IF FND_GLOBAL.CONC_REQUEST_ID > 0 THEN
168 FND_FILE.PUT_LINE(FND_FILE.LOG, p_msg);
169 END IF;
170 cz_utils.log_report(G_PKG_NAME, p_caller, p_ndebug, p_msg, p_level);
171 END log_msg;
172
173 --------------------------------------------------------------------------------
174 PROCEDURE get_commit_size_setting IS
175 BEGIN
176 SELECT NVL(TO_NUMBER(value), 50000) INTO m_commit_size
177 FROM cz_db_settings
178 WHERE upper(SECTION_NAME) = 'SCHEMA' AND upper(SETTING_ID) = 'BATCHSIZE';
179 EXCEPTION
180 WHEN NO_DATA_FOUND THEN
181 m_commit_size := 50000;
182 END get_commit_size_setting;
183
184 --------------------------------------------------------------------------------
185
186 FUNCTION check_model(p_model_id IN NUMBER) RETURN NUMBER
187 IS
188 l_model_type INTEGER;
189 BEGIN
190 -- each node has name ?
191 BEGIN
192 SELECT MODEL_TYPE_NAME_ERR INTO l_model_type FROM cz_ps_nodes
193 WHERE deleted_flag = '0' AND devl_project_id IN
194 (SELECT component_id FROM cz_model_ref_expls
195 WHERE deleted_flag = '0' AND model_id = p_model_id
196 AND (ps_node_type = PS_NODE_TYPE_REFERENCE OR parent_expl_node_id IS NULL))
197 AND name IS NULL AND rownum < 2;
198 EXCEPTION
199 WHEN NO_DATA_FOUND THEN
200 l_model_type := MODEL_TYPE_NORMAL;
201 END;
202
203 -- 1 pid maps exactly with 1 name ?
204 IF l_model_type = MODEL_TYPE_NORMAL THEN
205 FOR i IN (SELECT persistent_node_id, COUNT(distinct name)
206 FROM cz_ps_nodes
207 WHERE deleted_flag = '0' AND devl_project_id IN
208 (SELECT component_id FROM cz_model_ref_expls
209 WHERE deleted_flag = '0' AND model_id = p_model_id
210 AND (ps_node_type = PS_NODE_TYPE_REFERENCE OR
211 parent_expl_node_id IS NULL))
212 GROUP BY persistent_node_id
213 HAVING COUNT(DISTINCT name) > 1)
214 LOOP
215 l_model_type := MODEL_TYPE_ABNORMAL;
216 EXIT;
217 END LOOP;
218 END IF;
219
220 RETURN l_model_type;
221 END check_model;
222
223 --------------------------------------------------------------------------------
224 -- to do: 1. collect upgraded hdrs, then check missed items using bulk bind?
225 -- 2. check if child model already in map when building map?
226 PROCEDURE upgrade_configs_by_model(p_model_id IN NUMBER
227 ,p_begin_date IN DATE
228 ,p_end_date IN DATE
229 ,x_retcode OUT NOCOPY NUMBER
230 -- ,x_msg OUT NOCOPY VARCHAR2
231 )
232 IS
233 l_api_name CONSTANT VARCHAR2(30) := 'upgrade_configs_by_model';
234 l_cmt_rec_count PLS_INTEGER;
235 l_ndebug PLS_INTEGER;
236 l_msg VARCHAR2(1000);
237 TYPE num_tbl_type IS TABLE OF NUMBER INDEX BY BINARY_INTEGER;
238 TYPE name_tbl_type IS TABLE OF cz_ps_nodes.name%TYPE INDEX BY BINARY_INTEGER;
239 TYPE name_tbl_type_idx_vc2 IS TABLE OF cz_ps_nodes.name%TYPE INDEX BY VARCHAR2(15);
240 TYPE complex_num_tbl_type IS TABLE OF num_tbl_type_index_vc2 INDEX BY VARCHAR2(15);
241 TYPE complex_name_tbl_type IS TABLE OF name_tbl_type_idx_vc2 INDEX BY VARCHAR2(15);
242
243 l_hdr_tbl num_tbl_type;
244 l_rev_tbl num_tbl_type;
245 l_mdl_tbl num_tbl_type;
246 l_model_type_map num_tbl_type_index_vc2;
247 l_prj_pid_name_map complex_name_tbl_type;
248 l_ref_node_map complex_num_tbl_type;
249
250 l_model_id NUMBER;
251 l_model_type INTEGER;
252 l_model_name cz_devl_projects.name%TYPE;
253 l_item_prj_map num_tbl_type_index_vc2;
254 l_item_tbl num_tbl_type;
255 l_name_tbl name_tbl_type;
256 l_prj_id NUMBER;
257
258 l_upd_item_count PLS_INTEGER;
259 l_miss_item_count PLS_INTEGER;
260 l_fail_hdr_count PLS_INTEGER;
261 l_miss_item_tbl num_tbl_type;
262 l_no_miss_item BOOLEAN;
263
264 PROCEDURE create_maps(p_model_id IN NUMBER)
265 IS
266 BEGIN
267 FOR i IN (SELECT devl_project_id, persistent_node_id, name, ps_node_type, reference_id
268 FROM cz_ps_nodes
269 WHERE deleted_flag = '0' AND devl_project_id in
270 (SELECT component_id FROM cz_model_ref_expls
271 WHERE deleted_flag = '0' AND model_id = p_model_id
272 AND (ps_node_type = PS_NODE_TYPE_REFERENCE OR parent_expl_node_id IS NULL)))
273 LOOP
274 l_prj_pid_name_map(i.devl_project_id)(i.persistent_node_id) := i.name;
275 IF i.ps_node_type = PS_NODE_TYPE_REFERENCE THEN
276 l_ref_node_map(i.persistent_node_id)(i.devl_project_id) := i.reference_id;
277 END IF;
278 END LOOP;
279 END create_maps;
280
281 BEGIN
282 l_ndebug := 1;
283 log_msg(l_api_name, l_ndebug, 'model_id=' || p_model_id, FND_LOG.LEVEL_PROCEDURE);
284
285 SELECT config_hdr_id, config_rev_nbr, component_id
286 BULK COLLECT INTO l_hdr_tbl, l_rev_tbl, l_mdl_tbl
287 FROM cz_config_hdrs hdr
288 WHERE deleted_flag = '0'
289 AND creation_date >= NVL(p_begin_date, cz_utils.EPOCH_BEGIN_)
290 AND creation_date <= NVL(p_end_date, SYSDATE)
291 AND persistent_component_id = (SELECT persistent_project_id
292 FROM cz_devl_projects
293 WHERE devl_project_id = p_model_id)
294 AND EXISTS (SELECT NULL FROM cz_config_items
295 WHERE config_hdr_id = hdr.config_hdr_id
296 AND config_rev_nbr = hdr.config_rev_nbr
297 AND (parent_config_item_id IS NULL OR parent_config_item_id = -1)
298 AND ps_node_name IS NULL);
299
300 IF l_hdr_tbl.COUNT = 0 THEN
301 SELECT name INTO l_model_name
302 FROM cz_devl_projects
303 WHERE devl_project_id = p_model_id;
304 l_msg := cz_utils.get_text('CZ_UPGCFG_NO_CFG', 'MODELNAME', l_model_name);
305 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_STATEMENT);
306 x_retcode := CP_RETCODE_SUCCESS;
307 RETURN;
308 ELSE
309 l_msg := 'Number of configs found which need to be upgraded for model '
310 || p_model_id|| ': ' || l_hdr_tbl.COUNT;
311 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_STATEMENT);
312 END IF;
313
314 l_ndebug := 2;
315 l_cmt_rec_count := 0;
316 l_fail_hdr_count := 0;
317 l_no_miss_item := TRUE;
318 FOR i IN l_hdr_tbl.FIRST .. l_hdr_tbl.LAST LOOP
319 -- Use the config src model if the model and all its referred models still exist
320 -- Use the common model otherwise
321 l_model_id := p_model_id;
322 BEGIN
323 SELECT devl_project_id INTO l_model_id
324 FROM cz_devl_projects
325 WHERE devl_project_id = l_mdl_tbl(i) AND deleted_flag = '0';
326
327 SELECT p_model_id INTO l_model_id
328 FROM cz_model_ref_expls re
329 WHERE deleted_flag = '0' AND model_id = l_mdl_tbl(i)
330 AND ps_node_type = PS_NODE_TYPE_REFERENCE
331 AND NOT EXISTS (SELECT 1 FROM cz_devl_projects
332 WHERE deleted_flag = '0' AND devl_project_id = re.component_id)
333 AND ROWNUM < 2;
334 EXCEPTION
335 WHEN NO_DATA_FOUND THEN
336 NULL;
337 END;
338
339 l_ndebug := 3;
340 IF l_model_type_map.EXISTS(l_model_id) THEN
341 l_model_type := l_model_type_map(l_model_id);
342 ELSE
343 l_model_type := check_model(l_model_id);
344 IF l_model_type = MODEL_TYPE_ABNORMAL THEN
345 create_maps(l_model_id);
346 ELSIF l_model_type = MODEL_TYPE_NAME_ERR THEN
347 -- should never happen, otherwise need an fnd msg
348 l_msg := 'Model ' || l_model_id || ' cannot be used in config upgrade ' ||
349 'because some nodes have no name';
350 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_ERROR);
351 END IF;
352 l_model_type_map(l_model_id) := l_model_type;
353 END IF;
354
355 -- print_maps(l_prj_pid_name_map, l_ref_node_map, l_model_type_map);
356 IF l_model_type <> MODEL_TYPE_NAME_ERR THEN
357 l_msg := 'Processing config (' || l_hdr_tbl(i) || ',' || l_rev_tbl(i) ||
358 ') vs. type ' || l_model_type || ' model ' || l_model_id;
359 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_STATEMENT);
360 END IF;
361
362 l_miss_item_tbl.DELETE;
363 IF l_model_type = MODEL_TYPE_NORMAL THEN
364 l_ndebug := 4;
365 UPDATE cz_config_items item
366 SET ps_node_name =
367 (SELECT name FROM cz_ps_nodes psn
368 WHERE deleted_flag = '0' AND persistent_node_id = item.ps_node_id
369 AND EXISTS (SELECT 1 FROM cz_model_ref_expls
370 WHERE deleted_flag = '0' AND model_id = l_model_id
371 AND (ps_node_type = PS_NODE_TYPE_REFERENCE OR parent_expl_node_id IS NULL)
372 AND component_id = psn.devl_project_id)
373 AND rownum < 2)
374 WHERE config_hdr_id = l_hdr_tbl(i) AND config_rev_nbr = l_rev_tbl(i);
375 l_cmt_rec_count := l_cmt_rec_count + SQL%ROWCOUNT;
376
377 SELECT config_item_id BULK COLLECT INTO l_miss_item_tbl
378 FROM cz_config_items
379 WHERE config_hdr_id = l_hdr_tbl(i) AND config_rev_nbr = l_rev_tbl(i)
380 AND deleted_flag = '0' AND ps_node_name IS NULL;
381
382 ELSIF l_model_type = MODEL_TYPE_ABNORMAL THEN
383 l_ndebug := 5;
384 l_upd_item_count := 0;
385 l_miss_item_count := 0;
386 l_item_tbl.DELETE;
387 l_name_tbl.DELETE;
388 l_item_prj_map.DELETE;
389 FOR j IN (SELECT config_item_id, ps_node_id, parent_config_item_id
390 FROM cz_config_items
391 WHERE deleted_flag = '0'
392 START WITH (parent_config_item_id IS NULL OR parent_config_item_id = -1)
393 AND config_hdr_id = l_hdr_tbl(i) AND config_rev_nbr = l_rev_tbl(i)
394 CONNECT BY PRIOR config_item_id = parent_config_item_id
395 AND config_hdr_id = l_hdr_tbl(i) AND config_rev_nbr = l_rev_tbl(i)
396 AND deleted_flag = '0')
397 LOOP
398 IF j.parent_config_item_id IS NULL OR j.parent_config_item_id = -1 THEN
399 l_prj_id := l_model_id;
400 ELSE
401 l_prj_id := l_item_prj_map(j.parent_config_item_id);
402 END IF;
403
404 IF l_prj_pid_name_map.EXISTS(l_prj_id) AND l_prj_pid_name_map(l_prj_id).EXISTS(j.ps_node_id) THEN
405 l_upd_item_count := l_upd_item_count + 1;
406 l_item_tbl(l_upd_item_count) := j.config_item_id;
407 l_name_tbl(l_upd_item_count) := l_prj_pid_name_map(l_prj_id)(j.ps_node_id);
408 ELSE
409 l_miss_item_count := l_miss_item_count + 1;
410 l_miss_item_tbl(l_miss_item_count) := j.config_item_id;
411 END IF;
412
413 IF l_ref_node_map.EXISTS(j.ps_node_id) AND l_ref_node_map(j.ps_node_id).EXISTS(l_prj_id) THEN
414 l_item_prj_map(j.config_item_id) := l_ref_node_map(j.ps_node_id)(l_prj_id);
415 ELSE
416 l_item_prj_map(j.config_item_id) := l_prj_id;
417 END IF;
418 END LOOP;
419
420 -- print_maps(l_item_prj_map, l_item_tbl, l_name_tbl, l_miss_item_tbl);
421 l_ndebug := 6;
422 FORALL j IN l_item_tbl.FIRST .. l_item_tbl.LAST
423 UPDATE cz_config_items
424 SET ps_node_name = l_name_tbl(j)
425 WHERE config_hdr_id = l_hdr_tbl(i) AND config_rev_nbr = l_rev_tbl(i)
426 AND config_item_id = l_item_tbl(j);
427
428 l_cmt_rec_count := l_cmt_rec_count + l_upd_item_count;
429
430 ELSE
431 -- ? try to use p_model_id if l_model_id <> p_model_id
432 l_ndebug := 7;
433 l_fail_hdr_count := l_fail_hdr_count + 1;
434 END IF;
435
436 l_ndebug := 8;
437 IF l_cmt_rec_count >= m_commit_size THEN
438 COMMIT;
439 l_cmt_rec_count := 0;
440 END IF;
441
442 IF l_miss_item_tbl.COUNT > 0 THEN
443 l_no_miss_item := FALSE;
444 FOR j IN l_miss_item_tbl.FIRST ..l_miss_item_tbl.LAST LOOP
445 l_msg := cz_utils.get_text('CZ_UPGCFG_ITEM_NO_NODE', 'ID', to_char(l_miss_item_tbl(j)),
446 'HDR', to_char(l_hdr_tbl(i)), 'REV', to_char(l_rev_tbl(i)));
447 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_STATEMENT);
448 END LOOP;
449 END IF;
450
451 IF l_model_type = MODEL_TYPE_NAME_ERR THEN
452 l_msg := 'config (' || l_hdr_tbl(i) || ',' || l_rev_tbl(i) || ') not upgraded';
453 ELSE
454 l_msg := 'config (' || l_hdr_tbl(i) || ',' || l_rev_tbl(i) || ') upgraded';
455 END IF;
456 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_STATEMENT);
457 END LOOP;
458
459 l_ndebug := 10;
460 IF l_cmt_rec_count > 0 THEN
461 COMMIT;
462 END IF;
463
464 IF l_fail_hdr_count = 0 AND l_no_miss_item THEN
465 x_retcode := CP_RETCODE_SUCCESS;
466 -- x_msg := 'All configs with model ' || p_model_id || ' upgraded';
467 ELSIF l_fail_hdr_count = l_hdr_tbl.COUNT THEN
468 x_retcode := CP_RETCODE_FAILURE;
469 -- x_msg := 'All configs with model ' || p_model_id || ' failed in upgrade';
470 ELSE
471 x_retcode := CP_RETCODE_WARNING;
472 -- x_msg := 'Not all configs with model ' || p_model_id || ' upgraded: ' ||
473 -- 'some configs either not processed at all or just partially upgraded';
474 END IF;
475 -- log_msg(l_api_name, l_ndebug, x_msg, FND_LOG.LEVEL_PROCEDURE);
476 EXCEPTION
477 WHEN OTHERS THEN
478 x_retcode := CP_RETCODE_FAILURE;
479 l_msg := 'Fatal error in ' || l_api_name || '.' || l_ndebug || ': ' ||
480 substr(SQLERRM,1,900);
481 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_UNEXPECTED);
482 END upgrade_configs_by_model;
483 --------------------------------------------------------------------------------
484
485 PROCEDURE upgrade_configs_by_item(p_organization_id IN NUMBER
486 ,p_inventory_item_id IN NUMBER
487 ,p_application_id IN NUMBER
488 ,p_begin_date IN DATE
489 ,p_end_date IN DATE
490 ,x_retcode OUT NOCOPY NUMBER
491 -- ,x_msg OUT NOCOPY VARCHAR2
492 )
493 IS
494 l_api_name CONSTANT VARCHAR2(30) := 'upgrade_configs_by_item';
495 l_model_id cz_devl_projects.devl_project_id%TYPE;
496 l_ndebug INTEGER;
497 l_msg VARCHAR2(1000);
498 l_msg_name VARCHAR2(30);
499 BEGIN
500 l_ndebug := 1;
501 l_msg := 'BEGIN: org=' || p_organization_id || ', inv item=' || p_inventory_item_id;
502 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_PROCEDURE);
503 l_model_id := cz_cf_api.config_model_for_item(p_inventory_item_id,
504 p_organization_id, SYSDATE, p_application_id, NULL);
505 IF l_model_id IS NULL THEN
506 x_retcode := CP_RETCODE_FAILURE;
507 l_msg := cz_utils.get_text('CZ_UPGCFG_NO_PUB_ITEM', 'ITEM', to_char(p_inventory_item_id),
508 'ORG', to_char(p_organization_id));
509 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_ERROR);
510 RETURN;
511 END IF;
512
513 l_ndebug := 2;
514 IF check_model(l_model_id) = MODEL_TYPE_NAME_ERR THEN
515 -- should never happen, otherwise need an fnd msg
516 x_retcode := CP_RETCODE_FAILURE;
517 l_msg := 'Not all nodes in the published model ' || l_model_id || ' have names';
518 ELSE
519 l_ndebug := 3;
520 upgrade_configs_by_model(l_model_id
521 ,p_begin_date
522 ,p_end_date
523 ,x_retcode
524 -- ,x_msg
525 );
526 END IF;
527 IF x_retcode = CP_RETCODE_SUCCESS THEN
528 l_msg_name := 'CZ_UPGCFG_ITEM_SUCC';
529 ELSIF x_retcode = CP_RETCODE_WARNING THEN
530 l_msg_name := 'CZ_UPGCFG_ITEM_WARN';
531 ELSE
532 l_msg_name := 'CZ_UPGCFG_ITEM_FAIL';
533 END IF;
534 l_msg := cz_utils.get_text(l_msg_name, 'ITEM', to_char(p_inventory_item_id),
535 'ORG', to_char(p_organization_id));
536 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_PROCEDURE);
537 EXCEPTION
538 WHEN OTHERS THEN
539 x_retcode := CP_RETCODE_FAILURE;
540 l_msg := 'Fatal error in ' || l_api_name || '.' || l_ndebug || ': ' ||
541 substr(SQLERRM,1,900);
542 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_UNEXPECTED);
543 END upgrade_configs_by_item;
544 --------------------------------------------------------------------------------
545
546 /*
547 * Concurrent procedure for Configuration Upgrade by Item(s).
548 * @param errbuf Standard Oracle Concurrent Program output parameters.
549 * @param retcode Standard Oracle Concurrent Program output parameters.
550 * @param p_organization_id Used to search configurations by organization ID, required.
551 * @param p_top_inv_item_from Used to search configurations by top item, optional
552 * @param p_top_inv_item_to Used to search configurations by top item, optional
553 * @param p_application_id Used to refine search for equivalent published
554 * models to use as baselines for upgrade, optional.
555 * @param p_config_begin_date Optional, if present, indicates the date of the oldest
556 * configuration to be updated.
557 * @param p_config_end_date Optional, if present, indicates the date of the newest
558 * configuration to be updated.
559 */
560
561 PROCEDURE upgrade_configs_by_items_cp
562 (errbuf OUT NOCOPY VARCHAR2
563 ,retcode OUT NOCOPY NUMBER
564 ,p_organization_code IN VARCHAR2
565 ,p_organization_id IN NUMBER
566 ,p_top_inv_item_from IN VARCHAR2
567 ,p_top_inv_item_to IN VARCHAR2
568 ,p_application_id IN NUMBER
569 ,p_config_begin_date IN VARCHAR2
570 ,p_config_end_date IN VARCHAR2
571 )
572 IS
573 l_api_name CONSTANT VARCHAR2(30) := 'upgrade_configs_by_items';
574 l_item_tbl num_tbl_type;
575 l_org_tbl num_tbl_type;
576 l_org_id NUMBER;
577 l_one_org BOOLEAN;
578 l_begin_date DATE;
579 l_end_date DATE;
580 l_num_invitem INTEGER;
581 l_num_success PLS_INTEGER;
582 l_num_warning PLS_INTEGER;
583 l_num_failure PLS_INTEGER;
584 l_ndebug PLS_INTEGER;
585 l_retcode NUMBER;
586 l_msg VARCHAR2(1000);
587
588 BEGIN
589 l_ndebug := 1;
590 l_msg := 'BEGIN: org=' || nvl(to_char(p_organization_id), 'null') || ',' ||
591 'from_item=' || nvl(p_top_inv_item_from, 'null') || ',' ||
592 'to_item=' || nvl(p_top_inv_item_to, 'null') || ',' ||
593 'application=' || nvl(to_char(p_application_id), 'null') || ',' ||
594 'begin_date=' || nvl(p_config_begin_date, 'null') || ',' ||
595 'end_date=' || nvl(p_config_end_date, 'null');
596 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_PROCEDURE);
597
598 l_num_success := 0;
599 l_num_warning := 0;
600 l_num_failure := 0;
601
602 l_begin_date := fnd_date.canonical_to_date(p_config_begin_date);
603 l_end_date := fnd_date.canonical_to_date(p_config_end_date);
604
605 l_ndebug := 2;
606 IF p_organization_id IS NULL THEN
607 l_one_org := FALSE;
608 SELECT DISTINCT top_item_id, organization_id
609 BULK COLLECT INTO l_item_tbl, l_org_tbl
610 FROM cz_model_publications
611 WHERE deleted_flag = '0' AND object_type = 'PRJ'
612 AND source_target_flag = 'T' AND export_status = 'OK'
613 AND top_item_id IS NOT NULL AND organization_id IS NOT NULL;
614 ELSE
615 l_one_org := TRUE;
616 IF p_top_inv_item_from IS NULL AND p_top_inv_item_to IS NULL THEN
617 SELECT DISTINCT top_item_id BULK COLLECT INTO l_item_tbl
618 FROM cz_model_publications
619 WHERE deleted_flag = '0' AND object_type = 'PRJ'
620 AND source_target_flag = 'T' AND export_status = 'OK'
621 AND organization_id = p_organization_id;
622 ELSE
623 SELECT inventory_item_id BULK COLLECT INTO l_item_tbl
624 FROM mtl_system_items_vl item
625 WHERE organization_id = p_organization_id
626 AND concatenated_segments BETWEEN NVL(p_top_inv_item_from, p_top_inv_item_to)
627 AND NVL(p_top_inv_item_to, p_top_inv_item_from)
628 AND bom_item_type = BOM_ITEM_TYPE_MODEL
629 AND exists (SELECT NULL FROM cz_model_publications
630 WHERE deleted_flag = '0' AND object_type = 'PRJ'
631 AND source_target_flag = 'T' AND export_status = 'OK'
632 AND top_item_id = item.inventory_item_id
633 AND organization_id = p_organization_id);
634 END IF;
635 END IF;
636
637 l_num_invitem := l_item_tbl.COUNT;
638 log_msg(l_api_name, l_ndebug, 'Number of items: ' || l_num_invitem, FND_LOG.LEVEL_ERROR);
639 IF l_num_invitem = 0 THEN
640 retcode := CP_RETCODE_SUCCESS;
641 RETURN;
642 END IF;
643
644 l_ndebug := 3;
645 l_org_id := p_organization_id;
646 get_commit_size_setting;
647 FOR i IN l_item_tbl.FIRST .. l_item_tbl.LAST LOOP
648 IF NOT l_one_org THEN
649 l_org_id := l_org_tbl(i);
650 END IF;
651 upgrade_configs_by_item(l_org_id
652 ,l_item_tbl(i)
653 ,p_application_id
654 ,l_begin_date
655 ,l_end_date
656 ,l_retcode
657 -- ,l_msg
658 );
659 l_ndebug := l_ndebug + 1;
660 IF l_retcode = CP_RETCODE_SUCCESS THEN
661 l_num_success := l_num_success + 1;
662 ELSIF l_retcode = CP_RETCODE_WARNING THEN
663 l_num_warning := l_num_warning + 1;
664 ELSE
665 l_num_failure := l_num_failure + 1;
666 END IF;
667 END LOOP;
668
669 IF l_num_success = l_num_invitem THEN
670 retcode := CP_RETCODE_SUCCESS;
671 ELSIF l_num_failure = l_num_invitem THEN
672 retcode := CP_RETCODE_FAILURE;
673 ELSE
674 retcode := CP_RETCODE_WARNING;
675 END IF;
676 l_msg := cz_utils.get_text('CZ_UPGCFG_ITEMS', 'NSUCC', to_char(l_num_success),
677 'NWARN', to_char(l_num_warning), 'NFAIL', to_char(l_num_failure));
678 -- log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_ERROR);
679 errbuf := l_msg;
680 EXCEPTION
681 WHEN OTHERS THEN
682 retcode := CP_RETCODE_FAILURE;
683 errbuf := 'Fatal error in ' || l_api_name || '.' || l_ndebug || ': ' ||
684 substr(SQLERRM,1,900);
685 END upgrade_configs_by_items_cp;
686
687 ---------------------------------------------------------------------------------------
688 /*
689 * Concurrent procedure for Configuration Upgrade by Product key.
690 * @param errbuf Standard Oracle Concurrent Program output parameters.
691 * @param retcode Standard Oracle Concurrent Program output parameters.
692 * @param p_product_key Used to search configurations, required.
693 * @param p_application_id Used to refine search for equivalent published models
694 * to use as baselines for upgrade, optional.
695 * @param p_config_begin_date Optional, if present, indicates the date of the oldest
696 * configuration to be updated.
697 * @param p_config_end_date Optional, if present, indicates the date of the newest
698 * configuration to be updated.
699 */
700
701 PROCEDURE upgrade_configs_by_product_cp
702 (errbuf OUT NOCOPY VARCHAR2
703 ,retcode OUT NOCOPY NUMBER
704 ,p_product_key IN VARCHAR2
705 ,p_application_id IN NUMBER
706 ,p_config_begin_date IN VARCHAR2
707 ,p_config_end_date IN VARCHAR2
708 )
709 IS
710 l_api_name CONSTANT VARCHAR2(30) := 'upgrade_configs_by_product';
711 l_begin_date DATE;
712 l_end_date DATE;
713 l_model_id cz_devl_projects.devl_project_id%TYPE;
714 l_ndebug INTEGER;
715 l_msg VARCHAR2(1000);
716 l_msg_name VARCHAR2(30);
717 v_publication_id NUMBER;
718 BEGIN
719 l_ndebug := 1;
720 l_msg := 'BEGIN: product_key=' || p_product_key || ',' ||
721 'application=' || nvl(to_char(p_application_id), 'null') || ',' ||
722 'begin_date=' || nvl(p_config_begin_date, 'null') || ',' ||
723 'end_date=' || nvl(p_config_end_date, 'null');
724 log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_PROCEDURE);
725
726 l_begin_date := fnd_date.canonical_to_date(p_config_begin_date);
727 l_end_date := fnd_date.canonical_to_date(p_config_end_date);
728
729 get_commit_size_setting;
730
731 l_ndebug := 2;
732 l_model_id := cz_cf_api.config_model_for_product(p_product_key,SYSDATE,p_application_id,NULL);
733 IF l_model_id IS NULL THEN
734 errbuf := cz_utils.get_text('CZ_UPGCFG_NO_PUB_PRD', 'PRD', p_product_key);
735 retcode := CP_RETCODE_FAILURE;
736 log_msg(l_api_name, l_ndebug, errbuf, FND_LOG.LEVEL_ERROR);
737 RETURN;
738 ELSE
739 -- Bug 5496507; 14-Sep-2006; kdande; See if the model derived from publication is migrated and error out if it is, else proceed with upgrade.
740 DECLARE
741 -- Check if the model is a migrated one
742 CURSOR cur_model_migrated IS
743 SELECT 'Y' migrated
744 FROM cz_devl_projects dp
745 WHERE dp.devl_project_id = l_model_id
746 AND dp.post_migr_change_flag IS NOT NULL
747 AND dp.post_migr_change_flag <> 'L';
748 rec_model_migrated cur_model_migrated%ROWTYPE;
749 BEGIN
750 OPEN cur_model_migrated;
751 FETCH cur_model_migrated INTO rec_model_migrated;
752 IF (cur_model_migrated%FOUND) THEN
753 CLOSE cur_model_migrated;
754 v_publication_id := cz_cf_api.publication_for_product (
755 product_key => p_product_key,
756 config_lookup_date => SYSDATE,
757 calling_application_id => p_application_id,
758 usage_name => NULL,
759 publication_mode => NULL,
760 language => NULL
761 );
762 errbuf := cz_utils.get_text ('CZ_UPGCFG_WRONG_PUB4PRODKEY', 'PUBID1', v_publication_id, 'PUBID2', v_publication_id);
763 retcode := CP_RETCODE_FAILURE;
764 log_msg (l_api_name, l_ndebug, errbuf, FND_LOG.LEVEL_ERROR);
765 RETURN;
766 ELSE
767 CLOSE cur_model_migrated;
768 END IF;
769 END;
770 -- End of fix for bug 5496507
771 END IF;
772
773 l_ndebug := 3;
774 IF check_model(l_model_id) = MODEL_TYPE_NAME_ERR THEN
775 errbuf := 'Not all model nodes in model ' || l_model_id || ' have names';
776 retcode := CP_RETCODE_FAILURE;
777 ELSE
778 l_ndebug := 4;
779 upgrade_configs_by_model(l_model_id
780 ,l_begin_date
781 ,l_end_date
782 ,retcode
783 -- ,errbuf
784 );
785 END IF;
786 IF retcode = CP_RETCODE_SUCCESS THEN
787 l_msg_name := 'CZ_UPGCFG_PROD_SUCC';
788 ELSIF retcode = CP_RETCODE_WARNING THEN
789 l_msg_name := 'CZ_UPGCFG_PROD_WARN';
790 ELSE
791 l_msg_name := 'CZ_UPGCFG_PROD_FAIL';
792 END IF;
793 errbuf := cz_utils.get_text(l_msg_name, 'PRD', p_product_key);
794 -- l_msg := 'retcode=' || retcode || ',msg=' || errbuf;
795 -- log_msg(l_api_name, l_ndebug, l_msg, FND_LOG.LEVEL_PROCEDURE);
796 EXCEPTION
797 WHEN OTHERS THEN
798 retcode := CP_RETCODE_FAILURE;
799 errbuf := 'Fatal error in ' || l_api_name || '.' || l_ndebug || ': ' ||
800 substr(SQLERRM,1,900);
801 END upgrade_configs_by_product_cp;
802
803 ---------------------------------------------------------------------------------------
804 --------------------------- End of Configuration Upgrade ----------------------------
805 ---------------------------------------------------------------------------------------
806
807 /*
808 * This procedure converts a publication target to a Development Instance.
809 * @param errbuf Standard Oracle Concurrent Program output parameters.
810 * @param retcode Standard Oracle Concurrent Program output parameters.
811 */
812
813 PROCEDURE convert_instance_cp(errbuf OUT NOCOPY VARCHAR2,
814 retcode OUT NOCOPY NUMBER
815 ) IS
816
817 ALREADY_MIGRATED_EXCEPTION EXCEPTION;
818
819 l_return_status VARCHAR2(1);
820 l_msg_count NUMBER;
821 l_msg_data VARCHAR2(2000);
822
823 p_run_id NUMBER;
824 l_return BOOLEAN;
825
826 l_new_pb_id t_num_array_tbl_type;
827 l_old_pb_id t_num_array_tbl_type;
828
829 l_inst_str VARCHAR2(8000);
830 l_converted_target_flag VARCHAR2(1) ;
831
832 v_errorString VARCHAR2(1024) :='convert_instance: ';
833
834 BEGIN
835
836 --get the current value for converted flag
837 SELECT converted_target_flag
838 INTO l_converted_target_flag
839 FROM cz_servers
840 WHERE local_name = 'LOCAL';
841
842 IF l_converted_target_flag = '1' THEN
843 RAISE ALREADY_MIGRATED_EXCEPTION;
844 END IF;
845
846 --update the target server flag
847 update cz_servers
848 set converted_target_flag = '1' where
849 LOCAL_NAME = 'LOCAL';
850
851 --update the source server flag
852 --this will ensure that this server will be presented as a
853 --migration target my target_open_for function.
854 update cz_servers
855 set source_server_flag = '0' where
856 source_server_flag = '1';
857 --create a pseudo record for all the target publications
858 SELECT cz_model_publications_s.NEXTVAL, publication_id
859 BULK COLLECT
860 INTO l_new_pb_id, l_old_pb_id
861 FROM cz_model_publications
862 WHERE SOURCE_TARGET_FLAG = 'T'
863 AND cz_model_publications.deleted_flag = '0';
864
865 l_inst_str:= 'INSERT INTO cz_model_publications ' ||
866 ' (PUBLICATION_ID ' ||
867 ' ,MODEL_ID ' ||
868 ' ,OBJECT_ID ' ||
869 ' ,OBJECT_TYPE ' ||
870 ' ,SERVER_ID ' ||
871 ' ,ORGANIZATION_ID ' ||
872 ' ,TOP_ITEM_ID ' ||
873 ' ,PRODUCT_KEY ' ||
874 ' ,PUBLICATION_MODE ' ||
875 ' ,UI_DEF_ID ' ||
876 ' ,UI_STYLE ' ||
877 ' ,APPLICABLE_FROM ' ||
878 ' ,APPLICABLE_UNTIL ' ||
879 ' ,EXPORT_STATUS ' ||
880 ' ,MODEL_PERSISTENT_ID ' ||
881 ' ,DELETED_FLAG ' ||
882 ' ,MODEL_LAST_STRUCT_UPDATE ' ||
883 ' ,MODEL_LAST_LOGIC_UPDATE ' ||
884 ' ,MODEL_LAST_UPDATED ' ||
885 ' ,SOURCE_TARGET_FLAG ' ||
886 ' ,REMOTE_PUBLICATION_ID ' ||
887 ' ,CONTAINER ' ||
888 ' ,PAGE_LAYOUT ' ||
889 ' ,disabled_flag ' ||
890 ' ,converted_target_flag ' ||
891 ' ) ' ||
892 ' SELECT :1 ' ||
893 ' ,MODEL_ID ' ||
894 ' ,OBJECT_ID ' ||
895 ' ,OBJECT_TYPE ' ||
896 ' ,SERVER_ID ' ||
897 ' ,ORGANIZATION_ID ' ||
898 ' ,TOP_ITEM_ID ' ||
899 ' ,PRODUCT_KEY ' ||
900 ' ,PUBLICATION_MODE ' ||
901 ' ,UI_DEF_ID ' ||
902 ' ,UI_STYLE ' ||
903 ' ,APPLICABLE_FROM ' ||
904 ' ,APPLICABLE_UNTIL ' ||
905 ' ,EXPORT_STATUS ' ||
906 ' ,MODEL_PERSISTENT_ID ' ||
907 ' ,DELETED_FLAG ' ||
908 ' ,MODEL_LAST_STRUCT_UPDATE ' ||
909 ' ,MODEL_LAST_LOGIC_UPDATE ' ||
910 ' ,MODEL_LAST_UPDATED ' ||
911 ' ,''S'' ' ||
912 ' ,PUBLICATION_ID ' ||
913 ' ,CONTAINER ' ||
914 ' ,PAGE_LAYOUT ' ||
915 ' ,disabled_flag ' ||
916 ' ,''1'' ' ||
917 ' FROM cz_model_publications ' ||
918 ' WHERE publication_id = :2 ';
919
920 --insert the pseudo record
921 FORALL i IN 1..l_new_pb_id.COUNT
922 EXECUTE IMMEDIATE l_inst_str USING l_new_pb_id(i), l_old_pb_id(i);
923
924 COMMIT;
925
926 EXCEPTION
927 WHEN ALREADY_MIGRATED_EXCEPTION THEN
928 retcode:=2;
929 errbuf:=CZ_UTILS.Get_Text('CZ_ALREADY_CONVERTED_MESSAGE');
930 l_return := cz_utils.log_report(Msg => errbuf,
931 Urgency => 1,
932 ByCaller => 'CZ_MODEL_MIGRATION',
933 StatusCode => 11276,
934 RunId => p_run_id);
935 WHEN OTHERS THEN
936 rollback;
937 retcode:=2;
938 errbuf:=SQLERRM;
939 l_return := cz_utils.log_report(Msg => errbuf,
940 Urgency => 1,
941 ByCaller => 'CZ_MODEL_MIGRATION',
942 StatusCode => 11276,
943 RunId => p_run_id);
944 END;
945 ---------------------------------------------------------------------------------------
946 /*
947 * Once the target has been converted to a development instance,
948 * obselete all the source publications to that target.
949 */
950
951 PROCEDURE obsolete_nonpublishable(
952 p_commit_flag IN VARCHAR2,
953 x_return_status OUT NOCOPY VARCHAR2,
954 x_msg_count OUT NOCOPY NUMBER,
955 x_msg_data OUT NOCOPY VARCHAR2
956 )
957 IS
958 l_server_id NUMBER ;
959 r_instance_name_tbl t_varchar40_array_tbl_type;
960 obselete_exists VARCHAR2(1) := '0';
961 r_instance_name VARCHAR2(40);
962
963
964
965 BEGIN
966
967
968 FND_MSG_PUB.initialize;
969 x_return_status := FND_API.G_RET_STS_SUCCESS;
970
971 --get the instance name(s) that has been converted
972 r_instance_name_tbl := get_target_name_if_converted();
973
974
975 --we need to display a message in Developer
976 --if there are obseleted records.
977 --for each of the instances that have converted, check if there
978 --are obseleted records
979 IF ( r_instance_name_tbl.COUNT > 0) THEN
980
981 FOR i IN r_instance_name_tbl.FIRST..r_instance_name_tbl.LAST LOOP
982 r_instance_name := r_instance_name_tbl(i);
983
984 IF (r_instance_name IS NULL) THEN
985 RETURN;
986 END IF;
987
988 --get the local server id of the instance name
989 SELECT server_local_id
990 INTO l_server_id
991 FROM cz_servers
992 WHERE UPPER (local_name) = UPPER (r_instance_name);
993
994
995 obselete_exists := '0';
996
997 -- check if obselete exists
998 BEGIN
999
1000 SELECT '1'
1001 INTO obselete_exists
1002 FROM DUAL
1003 WHERE EXISTS (
1004 SELECT publication_id
1005 FROM cz_model_publications
1006 WHERE source_target_flag = 'S'
1007 AND deleted_flag = '0'
1008 AND export_status <> MODEL_PUBLICATION_OBSELETE
1009 AND server_id = l_server_id);
1010
1011 EXCEPTION
1012 WHEN NO_DATA_FOUND THEN
1013 obselete_exists := '0';
1014 END;
1015
1016 --if obselete exists
1017
1018 IF (obselete_exists = '1') THEN
1019
1020 x_return_status := FND_API.G_RET_STS_ERROR;
1021
1022 --add message to the error stack
1023 CZ_UTILS.add_error_message_to_stack(p_message_name => 'CZ_OBSELETE_RECORDS_EXISTS',
1024 p_token_name1 => 'INSTANCE_NAME',
1025 p_token_value1 => r_instance_name,
1026 x_msg_count => x_msg_count,
1027 x_msg_data => x_msg_data);
1028
1029
1030 --update all publications for local server id
1031 UPDATE cz_model_publications
1032 set export_status = MODEL_PUBLICATION_OBSELETE
1033 WHERE SOURCE_TARGET_FLAG = 'S'
1034 AND deleted_flag = '0'
1035 AND export_status <> MODEL_PUBLICATION_OBSELETE
1036 AND server_id = l_server_id;
1037
1038 END IF;
1039
1040 END LOOP;
1041
1042 END IF;
1043
1044 IF (p_commit_flag = FND_API.G_TRUE) THEN
1045 COMMIT;
1046 END IF;
1047
1048 EXCEPTION
1049 WHEN others THEN
1050 CZ_UTILS.add_exc_msg_to_fndstack(
1051 p_package_name => 'CZ_MODEL_MIGRATION',
1052 p_procedure_name => 'obselete_nonpublishable',
1053 p_error_message => SQLERRM);
1054
1055
1056 END;
1057 ---------------------------------------------------------------------------------------
1058 /* The target machine may have been convrted into
1059 * a Developer enabled, migratable machine.
1060 * If so, the target is publishable no more.
1061
1062 * This method will also be called from Developer
1063 * when a drop down of eligible targets is loaded
1064 * at the time of creating or editing a publication
1065 */
1066
1067 FUNCTION target_open_for (
1068 p_migration_or_publishing IN VARCHAR2,
1069 p_link_name IN VARCHAR2,
1070 p_local_name IN VARCHAR2
1071 ) RETURN VARCHAR2
1072 IS
1073 target_open VARCHAR2 (1) := '1';
1074 target_not_open VARCHAR2 (1) := '0';
1075 l_source_server_flag VARCHAR2 (1);
1076 l_source_server_flag_for_pub VARCHAR2 (1);
1077 l_sql_str VARCHAR2 (2000);
1078 l_sql_str_for_pub VARCHAR2 (2000);
1079 target_instance_for_pub VARCHAR2(2000);
1080 local_instance_name VARCHAR2(2000);
1081
1082 BEGIN
1083
1084 IF (p_migration_or_publishing = MODE_PUBLICATION) THEN
1085 IF (p_local_name='LOCAL') THEN
1086 RETURN target_open;
1087 END IF;
1088 END IF;
1089
1090 IF p_link_name IS NULL THEN
1091 RETURN target_not_open;
1092 END IF;
1093
1094 l_sql_str :=
1095 'SELECT NVL(source_server_flag,''0''), local_name FROM cz_servers@' || p_link_name || ' ' ||
1096 'WHERE source_server_flag = ''1'' ';
1097
1098 EXECUTE IMMEDIATE l_sql_str
1099 INTO l_source_server_flag, target_instance_for_pub;
1100
1101
1102 IF (p_migration_or_publishing = MODE_PUBLICATION) THEN
1103
1104 SELECT instance_name
1105 INTO local_instance_name
1106 FROM cz_servers
1107 WHERE local_name = 'LOCAL';
1108
1109 IF (local_instance_name=target_instance_for_pub) THEN
1110 RETURN target_open;
1111 END IF;
1112 END IF;
1113
1114 RETURN target_not_open;
1115
1116 EXCEPTION
1117 WHEN NO_DATA_FOUND THEN
1118 RETURN target_open;
1119 WHEN OTHERS THEN
1120 RETURN target_not_open;
1121 END;
1122 ---------------------------------------------------------------------------------------
1123 /*
1124 * For a given link name, get the converted target name.
1125 * The target machine may have been convrted into
1126 * a Developer enabled, migratable machine.
1127 * This method will get the converted target instance name
1128 */
1129
1130 FUNCTION get_converted_target(p_link_name IN VARCHAR2, p_instance_name IN VARCHAR2) RETURN VARCHAR2
1131 is
1132
1133
1134 l_instance_name VARCHAR(40);
1135 r_converted_target_flag VARCHAR(1);
1136 r_instance_name VARCHAR(40);
1137
1138 TYPE ref_cursor IS REF CURSOR;
1139 gl_ref_cursor ref_cursor;
1140
1141 BEGIN
1142
1143 --get the local name in the source server,
1144 --we will look for this instance in the remote target to check
1145 --if publication is still allowed.
1146
1147 IF p_link_name IS NULL then
1148 RETURN NULL;
1149 END IF;
1150
1151 -- check if publishable, this query will using the link on the remote machine
1152 OPEN gl_ref_cursor FOR 'SELECT converted_target_flag
1153 FROM cz_servers@'||p_link_name || ' where converted_target_flag = ''1''
1154 and local_name = ''LOCAL'' ';
1155 LOOP
1156 FETCH gl_ref_cursor INTO r_converted_target_flag;
1157 IF (r_converted_target_flag = TARGET_SERVER_PUBLISH_NOTALLOW) THEN
1158 CLOSE gl_ref_cursor ;
1159 RETURN p_instance_name;
1160 EXIT;
1161 END if;
1162 EXIT WHEN gl_ref_cursor%NOTFOUND;
1163 END LOOP;
1164 CLOSE gl_ref_cursor ;
1165
1166 RETURN NULL;
1167
1168 -- there may be exceptions where the remote link may not
1169 -- be available, the target may be at a different schema level
1170 -- just return the converted_target_flag as being allowed to
1171 -- publish in this case
1172
1173 EXCEPTION
1174 WHEN OTHERS THEN
1175 RETURN r_converted_target_flag;
1176
1177 END;
1178 ---------------------------------------------------------------------------------------
1179
1180 /* The target machine may have been convrted into
1181 * a Developer enabled, migratable machine.
1182 * If so, the target is publishable no more
1183 */
1184
1185 FUNCTION get_target_name_if_converted RETURN t_varchar40_array_tbl_type
1186 is
1187
1188 l_instance_name_tbl t_varchar40_array_tbl_type;
1189 l_link_name_tbl t_varchar40_array_tbl_type ;
1190
1191 r_converted_target VARCHAR2(40);
1192 r_converted_target_tbl t_varchar40_array_tbl_type;
1193 r_converted_target_count PLS_INTEGER :=1;
1194
1195 TYPE ref_cursor IS REF CURSOR;
1196 gl_ref_cursor ref_cursor;
1197
1198 BEGIN
1199
1200 -- collect the link name of the publishing target
1201 SELECT fndnam_link_name, instance_name
1202 BULK COLLECT
1203 INTO l_link_name_tbl, l_instance_name_tbl
1204 FROM cz_servers
1205 WHERE local_name <> 'LOCAL' AND FNDNAM_LINK_NAME IS NOT NULL ;
1206
1207 -- for each of the link_names collected, check if the
1208 -- remote target is still publishable
1209
1210 FOR i IN l_link_name_tbl.FIRST..l_link_name_tbl.LAST LOOP
1211 r_converted_target := get_converted_target(l_link_name_tbl(i), l_instance_name_tbl(i));
1212 IF (r_converted_target IS NOT NULL) THEN
1213 r_converted_target_tbl(r_converted_target_count) := r_converted_target;
1214 r_converted_target_count := r_converted_target_count + 1;
1215 END IF;
1216 END LOOP;
1217
1218 RETURN r_converted_target_tbl;
1219
1220 END;
1221 ---------------------------------------------------------------------------------------
1222 END;