DBA Data[Home] [Help]

PACKAGE BODY: APPS.DDR_ODI

Source


1 PACKAGE BODY DDR_ODI AS
2 /* $Header: ddrodib.pls 120.9.12020000.3 2012/08/04 02:32:16 gglover noship $ */
3 
4 FUNCTION get_user RETURN VARCHAR2
5  IS
6    v_user VARCHAR2(100);
7    v_sql_user VARCHAR2(1000);
8 
9 BEGIN
10   v_sql_user := 'select user from dual';
11   EXECUTE IMMEDIATE v_sql_user
12     INTO v_user;
13 
14 
15   IF v_user = 'APPS' THEN --{
16     /*If APPS user then EBS install and tables are in DDR schema */
17     v_user := 'DDR';
18   END IF; --}
19 
20 
21 RETURN v_user;
22 
23 END get_user;
24 
25 
26 FUNCTION SPLIT (p_in_string VARCHAR2, p_delim VARCHAR2) RETURN code_type
27  IS
28 
29    i      NUMBER :=0;
30    v_pos  NUMBER :=0;
31    v_str  VARCHAR2(1000) := p_in_string;
32    v_strings code_type;
33 
34 BEGIN
35    -- determine first chuck of string
36    v_pos := instr(v_str,p_delim,1,1);
37    -- if there is no delimiter in string
38    IF v_pos = 0 THEN--{
39      v_strings(0) := v_str;
40    ELSE
41      -- while there are chunks left, loop
42      WHILE ( v_pos <> 0) LOOP--{
43         -- create array element for chuck of string
44         v_strings(i) := substr(v_str,1,v_pos-1);
45         -- remove found chunk from original string
46         v_str := substr(v_str,v_pos+1,length(v_str));
47         -- determine next chunk
48         v_pos := instr(v_str,p_delim,1,1);
49         -- no last chunk, add to array
50         IF v_pos = 0 THEN--{
51            v_strings(i+1) := v_str;
52         END IF;--}
53         -- increment counter
54         i := i + 1;
55      END LOOP;--}
56    END IF;--}
57 
58    -- return array
59    RETURN v_strings;
60 
61 END SPLIT;
62 
63 
64 FUNCTION REMOVE_QUOTED_STRING (p_in_string VARCHAR2) RETURN VARCHAR2 IS
65 
66   v_pos1 NUMBER := 0;
67   v_pos2 NUMBER := 0;
68   v_str VARCHAR2(1000) := p_in_string;
69   v_final_string VARCHAR2(1000);
70 
71 BEGIN
72   -- determine first chunk of string
73   v_pos1 := instr(v_str,'''',1,1);
74   -- if there are no quotes, return original string
75   IF v_pos1 = 0 THEN--{
76     v_final_string := v_str;
77     -- if quote is at begining of the string find the 2nd
78   ELSIF v_pos1 = 1 THEN
79     -- find the 2nd quote position
80     v_pos2 := instr(v_str,'''',1,2);
81     -- remove the quoted chunk at the start
82     v_final_string := substr(v_str,v_pos2+2);
83   ELSE
84     -- remove the quoted chunk at the end
85     v_final_string := substr(v_str,1,v_pos1-2);
86   END iF;--}
87 
88   -- return string
89   RETURN v_final_string;
90 
91 END REMOVE_QUOTED_STRING;
92 
93 
94 PROCEDURE DUP_CHECK(p_src_tbl_name IN VARCHAR2, p_err_tbl_name IN VARCHAR2, p_key_cols IN VARCHAR2, p_src_typ IN VARCHAR2, p_load_id IN NUMBER) IS
95 
96    v_user VARCHAR2(100);
97 
98    CURSOR src_list IS
99       SELECT column_name
100       FROM all_tab_columns
101       WHERE owner = v_user
102       AND table_name = p_src_tbl_name
103       ORDER BY column_id;
104 
105    v_src_col_list code_type;
106    v_count NUMBER:=0;
107    v_err_select VARCHAR2(10000);
108    v_src_select VARCHAR2(10000);
109 
110 BEGIN
111    v_user := get_user;
112 
113    FOR col IN src_list LOOP
114       IF p_src_tbl_name = 'DDR_I_RTL_SL_RTN_ITEM' OR p_src_tbl_name = 'DDR_I_SLS_FRCST_ITEM' THEN --{
115          IF col.column_name NOT LIKE '%_AMOUNT' AND col.column_name <> 'ALLOC_PARENT_IDNT' THEN --{
116             v_src_col_list(v_count):=col.column_name;
117             v_src_select := v_src_select || ',' || v_src_col_list(v_count);
118             v_count := v_count+1;
119          END IF;--}
120       ELSE
121          v_src_col_list(v_count):=col.column_name;
122          v_src_select := v_src_select || ',' || v_src_col_list(v_count);
123          v_count := v_count+1;
124       END IF;--}
125    END LOOP;
126    v_src_select := LTRIM(v_src_select,',');
127 
128    IF p_src_typ = 'R' THEN
129       v_err_select:=v_src_select || ',LOAD_ID,ERR_REASON,ACTION_FLAG';
130       v_src_select:=v_src_select || ',' || p_load_id || ',''Duplicate Record;'',''N''';
131    ELSIF p_src_typ = 'F' THEN
132       v_err_select:=v_src_select || ',LOAD_ID,ERR_REASON,ACTION_FLAG,SRC_IDNT_FLAG';
133       v_src_select:=v_src_select || ',' || p_load_id || ',''Duplicate Record;'',''N'',''I''';
134    END IF;
135 
136 
137    /* Creating the INSERT SQL statement */
138    EXECUTE IMMEDIATE 'INSERT INTO ' || p_err_tbl_name || ' ( ' || v_err_select || ') SELECT ' || v_src_select || ' FROM ' || p_src_tbl_name || ' WHERE ( ' ||
139    p_key_cols || ' ) IN ( SELECT ' || p_key_cols || ' FROM ' || p_src_tbl_name || ' GROUP BY ' || p_key_cols || ' HAVING COUNT(*) > 1 )';
140    COMMIT;
141 
142    /* Creating the DELETE SQL Statement */
143    EXECUTE IMMEDIATE 'DELETE FROM '||p_src_tbl_name||' WHERE ('||p_key_cols||') IN (SELECT '||p_key_cols||' FROM '||p_src_tbl_name||' GROUP BY '||p_key_cols||
144         ' HAVING COUNT(*) > 1 )';
145    COMMIT;
146 
147 EXCEPTION
148   WHEN OTHERS THEN
149     RAISE;
150 END DUP_CHECK;
151 
152 
153 PROCEDURE MOVE_ERRORS(p_src_tbl_name IN VARCHAR2, p_err_tbl_name IN VARCHAR2, p_trgt_tbl_name IN VARCHAR2, p_src_typ IN VARCHAR2, p_load_id IN NUMBER) IS
154 BEGIN
155   MOVE_ERRORS(p_src_tbl_name=>p_src_tbl_name,p_err_tbl_name=>p_err_tbl_name,p_trgt_tbl_name=>p_trgt_tbl_name,p_src_typ=>p_src_typ,p_filter=>null,p_load_id=>p_load_id);
156 
157 END MOVE_ERRORS;
158 
159 
160 FUNCTION GET_ERROR(p_error_cd  VARCHAR2) RETURN VARCHAR2 IS
161 
162   v_err_msg VARCHAR2(240);
163 
164 BEGIN
165   EXECUTE IMMEDIATE 'SELECT lkup_name FROM DDR_R_LKUP_MST WHERE lkup_typ_cd=''ERR'' AND lkup_cd=:c1' INTO v_err_msg USING p_error_cd;
166 
167   RETURN v_err_msg;
168 EXCEPTION
169   WHEN OTHERS THEN
170   RAISE;
171 END GET_ERROR;
172 
173 
174 PROCEDURE IS_VALID(p_src_tab VARCHAR2
175                   ,p_src_clm VARCHAR2
176                   ,p_tgt_tab VARCHAR2
177                   ,p_tgt_clm VARCHAR2
178                   ,p_null_chk VARCHAR2 DEFAULT 'N'
179                   ,p_where VARCHAR2 DEFAULT NULL
180                   ,p_error_cols VARCHAR2 DEFAULT NULL
181                   ,p_error_cd VARCHAR2
182                   ,p_load_id NUMBER) IS
183 
184 
185   v_update_stmt VARCHAR2(4000);
186   v_where_stmt  VARCHAR2(4000);
187   v_null_stmt   VARCHAR2(1000);
188   v_sql VARCHAR2(4000);
189   v_src_clm_split code_type;
190   v_src_clm_count NUMBER;
191   v_pos NUMBER;
192   v_err_reason_string VARCHAR2(100);
193 
194 BEGIN
195   v_src_clm_split := split(p_src_clm,',');
196   v_src_clm_count := v_src_clm_split.COUNT;
197 
198   IF p_error_cols IS NULL THEN --{
199     v_err_reason_string := remove_quoted_string(p_src_clm);
200   ELSE
201     v_err_reason_string := p_error_cols;
202   END IF;--}
203 
204   EXECUTE IMMEDIATE 'UPDATE '||p_src_tab||' SET err_reason = '' '' WHERE err_reason=''Generic Error'' AND load_id ='||p_load_id;
205 
206   v_update_stmt := 'UPDATE '||p_src_tab||' SET err_reason = err_reason ||'''||v_err_reason_string||':''||ddr_odi.get_error('''||p_error_cd||
207         ''')||'';'' WHERE load_id = '||p_load_id||' AND (('|| p_src_clm||') NOT IN (SELECT ' ||p_tgt_clm||' FROM '||p_tgt_tab||' WHERE (1=1) ';
208 
209   IF p_where IS NOT NULL THEN --{
210     v_where_stmt := 'AND ('||p_where||'))';
211   ELSE
212     v_where_stmt := ')';
213   END IF; --}
214 
215   IF p_null_chk = 'Y' THEN --{
216     v_null_stmt := ' OR '|| v_src_clm_split(0)||' IS NULL';
217     WHILE (v_src_clm_count > 1) LOOP --{
218       v_pos := instr(v_src_clm_split(v_src_clm_count-1),'''',1,1);
219       IF v_pos = 0 THEN
220         v_null_stmt := v_null_stmt || ' OR ' || v_src_clm_split(v_src_clm_count-1)||' IS NULL ';
221       END IF;
222       v_src_clm_count:=v_src_clm_count-1;
223     END LOOP;--}
224     v_null_stmt := v_null_stmt || ')';
225   ELSE
226     v_null_stmt := v_null_stmt || ')';
227   END IF;--}
228 
229   v_sql := v_update_stmt || v_where_stmt || v_null_stmt;
230 
231   EXECUTE IMMEDIATE v_sql;
232   COMMIT;
233 
234 EXCEPTION
235   WHEN OTHERS THEN
236     RAISE;
237 END IS_VALID;
238 
239 
240 PROCEDURE NULL_CHECK(p_src_tab VARCHAR2, p_src_clm VARCHAR2, p_error_cd VARCHAR2,p_load_id NUMBER) IS
241 
242   v_sql VARCHAR2(4000);
243 
244 BEGIN
245   EXECUTE IMMEDIATE 'UPDATE '||p_src_tab||' SET err_reason = '' '' WHERE err_reason=''Generic Error'' AND load_id='||p_load_id;
246 
247   v_sql := 'UPDATE '||p_src_tab||' SET err_reason = err_reason ||'''||p_src_clm||':''||ddr_odi.get_error('''||p_error_cd||''')||'';'' WHERE '||p_src_clm||' IS NULL AND load_id='||p_load_id;
248 
249   EXECUTE IMMEDIATE v_sql;
250   COMMIT;
251 
252 EXCEPTION
253   WHEN OTHERS THEN
254     RAISE;
255 END NULL_CHECK;
256 
257 
258 PROCEDURE ALLOC_MOVE_ERR(p_src_tbl_name VARCHAR2,
259                          p_err_tbl_name VARCHAR2,
260                          p_trgt_tbl_name VARCHAR2,
261                          p_run_typ VARCHAR2,
262                          p_load_id NUMBER,
263                          p_generic_err_msg VARCHAR2) IS
264 
265     v_user VARCHAR2(100);
266 
267     CURSOR src_list IS
268       SELECT column_name
269       FROM all_tab_columns
270       WHERE owner = v_user
271       AND table_name = UPPER(p_src_tbl_name)
272       ORDER BY column_id;
273 
274    v_stg_tbl_name VARCHAR2(100);
275    v_src_col_list code_type;
276    v_err_select VARCHAR2(10000);
277    v_src_select VARCHAR2(10000);
278    v_src_select_after VARCHAR2(10000);
279    v_count NUMBER := 0;
280    v_insert_sql VARCHAR2(10000);
281    v_insert_stmt VARCHAR2(10000);
282    v_insert_select_stmt VARCHAR2(10000);
283    v_delete_sql VARCHAR2(10000);
284    v_err_msg VARCHAR2(300);
285 
286 BEGIN
287    v_user := get_user;
288 
289    FOR col IN src_list LOOP
290       v_src_col_list(v_count):=col.column_name;
291       v_src_select := v_src_select || ', ' || v_src_col_list(v_count);
292       v_count := v_count+1;
293    END LOOP;
294    v_src_select := LTRIM(v_src_select,',');
295    v_src_select := REPLACE(v_src_select,', ALLOC_PARENT_IDNT','');
296    v_src_select := REPLACE(v_src_select,', SLS_AMOUNT','');
297    v_src_select := REPLACE(v_src_select,', RTRN_AMOUNT','');
298    v_src_select := REPLACE(v_src_select,', SLS_COST_AMOUNT','');
299    v_src_select := REPLACE(v_src_select,', RTRN_COST_AMOUNT','');
300    /* For forecast flow, taking out unused column */
301    IF p_src_tbl_name = 'DDR_I_SLS_FRCST_ITEM' THEN
302       v_src_select := REPLACE(v_src_select,', RTL_BSNS_UNIT_CD','');
303    END IF;
304 
305    v_err_select:=v_src_select || ', LOAD_ID, ERR_REASON, ACTION_FLAG, SRC_IDNT_FLAG';
306 
307    IF p_run_typ = 'A' THEN --{
308       /* Moving error records from allocation flow */
309       /* Select for the invalid ORG Alloc records */
310       /* Checking if it's generic error messages */
311       IF p_generic_err_msg = 'Y' THEN
312          v_err_msg:='Generic Error';
313       ELSE
314          v_err_msg:=ddr_odi.get_error('DSR-1009');
315       END IF;
316       v_src_select_after:=v_src_select||', '||p_load_id||', '''||v_err_msg||''', ''N'', ''I''';
317 
318       v_insert_stmt:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||' WHERE rowid IN';
319 
320       v_insert_select_stmt:=' ((SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG=''O'' AND PERIOD_TYP_FLAG=''D'' AND rowid NOT IN'||
321            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL ))'||
322            ' UNION'||
323            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG NOT IN(''O'',''B'') AND PERIOD_TYP_FLAG IN(''D'',''W'') AND rowid NOT IN'||
324            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL)))';
325       v_insert_sql:=v_insert_stmt||v_insert_select_stmt;
326 
327       EXECUTE IMMEDIATE v_insert_sql;
328 
329       /* Union Select for Invalid Time Alloc records */
330       /* Checking if it's generic error messages */
331       IF p_generic_err_msg = 'Y' THEN
332          v_err_msg:='Generic Error';
333       ELSE
334          v_err_msg:=ddr_odi.get_error('DSR-1008');
335       END IF;
336       v_src_select_after:=v_src_select||', '||p_load_id||', '''||v_err_msg||''', ''N'', ''I''';
337 
338       v_insert_stmt:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||' WHERE rowid IN';
339 
340       v_insert_select_stmt:=' ((SELECT rowid FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG=''W'' AND LOC_IDNT_FLAG=''B'''||
341            ' AND ALLOC_PARENT_IDNT IS NULL AND rowid NOT IN'||
342            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL))'||
343            ' UNION'||
344            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG NOT IN (''W'',''D'') AND LOC_IDNT_FLAG IN (''O'',''B'') AND'||
345            '  ALLOC_PARENT_IDNT IS NULL AND rowid NOT IN'||
346            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL)))';
347       v_insert_sql:=v_insert_stmt||v_insert_select_stmt;
348 
349       EXECUTE IMMEDIATE v_insert_sql;
350 
351       /* Union Select for Parent of Invalid middle parent (has both org and time alloc) */
352       /* Checking if it's generic error messages */
353       IF p_generic_err_msg = 'Y' THEN
354          v_err_msg:='Generic Error';
355       ELSE
356          v_err_msg:=ddr_odi.get_error('DSR-1008');
357       END IF;
358       v_src_select_after:=v_src_select||', '||p_load_id||', '''||v_err_msg||''', ''N'', ''I''';
362            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL)))';
359       v_insert_stmt:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||' WHERE rowid IN';
360       v_insert_select_stmt:=' (SELECT rowid FROM '||p_src_tbl_name||' WHERE rowid IN'||
361            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG=''W'' AND rowid NOT IN'||
363       v_insert_sql:=v_insert_stmt||v_insert_select_stmt;
364 
365       EXECUTE IMMEDIATE v_insert_sql;
366       /*SWATANTRA Added below code to handle Period flag and Loc Flag NULL VALUES*/
367       V_INSERT_STMT:='INSERT INTO '||P_ERR_TBL_NAME||' ( '||V_ERR_SELECT||') SELECT '||V_SRC_SELECT_AFTER||' FROM '||P_SRC_TBL_NAME||' WHERE rowid IN';
368       v_insert_select_stmt:=' (SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG IS NULL OR PERIOD_TYP_FLAG IS NULL)';
369       V_INSERT_SQL:=V_INSERT_STMT||V_INSERT_SELECT_STMT;
370       /*SWATANTRA Added below code to handle Period flag and Loc Flag NULL VALUES*/
371       EXECUTE IMMEDIATE V_INSERT_SQL;
372 
373       /* SWATANTRA Added below code to handle Period flag and Loc Flag INVALID VALUES*/
374       V_INSERT_STMT:='INSERT INTO '||P_ERR_TBL_NAME||' ( '||V_ERR_SELECT||') SELECT '||V_SRC_SELECT_AFTER||' FROM '||P_SRC_TBL_NAME||' WHERE rowid IN';
375       v_insert_select_stmt:=' (SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG NOT IN (''O'',''B'') OR PERIOD_TYP_FLAG NOT IN (''W'',''D''))';
376       V_INSERT_SQL:=V_INSERT_STMT||V_INSERT_SELECT_STMT;
377       /*SWATANTRA Added below code to handle Period flag and Loc Flag INVALID VALUES*/
378       EXECUTE IMMEDIATE V_INSERT_SQL;
379 
380       /* SWATANTRA Added below code to INVALID_LOC_CD, ORG_LVL_CD,ORG_CD*/
381       V_INSERT_STMT:='INSERT INTO '||P_ERR_TBL_NAME||' ( '||V_ERR_SELECT||') SELECT '||V_SRC_SELECT_AFTER||' FROM '||P_SRC_TBL_NAME||' WHERE rowid NOT IN';
382       V_INSERT_SELECT_STMT:=' (SELECT '||P_SRC_TBL_NAME||'.'||'rowid FROM '||P_SRC_TBL_NAME||','||'DDR_R_ORG_ALLOC '||' WHERE '||
383       P_SRC_TBL_NAME||'.'||'RTL_ORG_CD '||'= DDR_R_ORG_ALLOC.ORG_CD '|| 'AND '||P_SRC_TBL_NAME||'.'||'LOC_IDNT_CD' ||' =DECODE('||
384       P_SRC_TBL_NAME||'.'||'ALLOC_PARENT_IDNT, NULL,DDR_R_ORG_ALLOC.LOC_IDNT_CD,DDR_R_ORG_ALLOC.BSNS_UNIT_CD) '||
385       'AND '||p_src_tbl_name||'.'||'ORG_LVL_CD' ||' =DDR_R_ORG_ALLOC.ORG_LVL_CD ) AND '||p_src_tbl_name||'.'||'PERIOD_TYP_FLAG =''W'''||
386       'AND '||p_src_tbl_name||'.'||'LOC_IDNT_FLAG =''O''';
387       V_INSERT_SQL:=V_INSERT_STMT||V_INSERT_SELECT_STMT;
388       /* SWATANTRA Added below code to handle Period flag and Loc Flag NULL VALUES*/
389       EXECUTE IMMEDIATE V_INSERT_SQL;
390       COMMIT;
391 
392       /* Creating the ORG DELETE SQL statement */
393       v_delete_sql:='DELETE FROM '||p_src_tbl_name||' WHERE rowid IN'||
394            /* Select for the invalid ORG Alloc records */
395            ' ((SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG=''O'' AND PERIOD_TYP_FLAG=''D'' AND rowid NOT IN'||
396            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL ))'||
397            /* Union Select for Invalid Time Alloc records */
398            ' UNION'||
399            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG=''W'' AND LOC_IDNT_FLAG=''B'' AND'||
400            ' ALLOC_PARENT_IDNT IS NULL AND rowid NOT IN'||
401            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL))'||
402            ' UNION'||
403            /* Union Select for Parent of Invalid middle parent (has both org and time alloc) */
404            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE rowid IN'||
405            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG=''W'' AND LOC_IDNT_FLAG=''B'' AND rowid NOT IN'||
406            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL)))'||
407            /* Union Select for Invalid middle parent (has both org and time alloc) */
408            ' UNION'||
409            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG=''W'' AND LOC_IDNT_FLAG=''B'' AND rowid NOT IN'||
410            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL))'||
411            /*Union Select for Invalid code for Org Allocation */
412            ' UNION'||
413            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE LOC_IDNT_FLAG NOT IN(''O'',''B'') AND PERIOD_TYP_FLAG IN(''D'',''W'') AND rowid NOT IN'||
414            ' (SELECT ALLOC_PARENT_IDNT FROM DDR_I_RTL_SL_RTN_ITEM WHERE ALLOC_PARENT_IDNT IS NOT NULL))'||
415            /*Union Select for Invalid code for time allocation*/
416            ' UNION'||
417            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE PERIOD_TYP_FLAG NOT IN (''W'',''D'') AND LOC_IDNT_FLAG IN (''O'',''B'')'||
418            ' AND ALLOC_PARENT_IDNT IS NULL AND rowid NOT IN'||
419            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL)))';
420 
421       EXECUTE IMMEDIATE v_delete_sql;
422       COMMIT;
423 
424    ELSIF p_run_typ = 'F' THEN --{
425       /*Moving errors from the regular interface */
426       v_src_select_after:=v_src_select||', '||p_load_id||', ''Generic Error'', ''N'', ''I''';
427 
428       v_stg_tbl_name:='I$_' || p_trgt_tbl_name;
429 
430       /* Creating the INSERT SQL statement */
431       /* Moving error records for records that had no allocation */
432       v_insert_sql:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||
433            ' WHERE PERIOD_TYP_FLAG=''D'' AND LOC_IDNT_FLAG=''B'' AND ALLOC_PARENT_IDNT IS NULL AND NOT EXISTS'||
434            ' ( SELECT REC_ID  FROM '||v_stg_tbl_name||' WHERE '||v_stg_tbl_name||'.ROWID_INT = '||p_src_tbl_name||'.rowid )';
435 
436       EXECUTE IMMEDIATE v_insert_sql;
437 
438       /* Moving error records that had Org allocation children fail*/
439       v_insert_sql:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||
440            ' WHERE rowid IN'||
444            ' (SELECT rowid_int from '||v_stg_tbl_name||' WHERE '||v_stg_tbl_name||'.rowid_int = '||p_src_tbl_name||'.rowid)))';
441            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE rowid IN'||
442            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL AND LOC_IDNT_FLAG=''B'' AND'||
443            ' PERIOD_TYP_FLAG=''D'' AND rowid NOT IN '||
445       EXECUTE IMMEDIATE v_insert_sql;
446 
447       /*Moving error records that had Time allocation children fail*/
448       v_insert_sql:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select_after||' FROM '||p_src_tbl_name||
449            ' WHERE rowid IN'||
450            ' (SELECT rowid FROM '||p_src_tbl_name||' WHERE rowid IN'||
451            ' (SELECT ALLOC_PARENT_IDNT FROM '||p_src_tbl_name||' WHERE ALLOC_PARENT_IDNT IS NOT NULL AND LOC_IDNT_FLAG=''B'' AND'||
452            ' PERIOD_TYP_FLAG=''W'' AND rowid NOT IN '||
453            --' (SELECT rowid_int from '||v_stg_tbl_name||' WHERE '||v_stg_tbl_name||'.rowid_int = '||p_src_tbl_name||'.rowid)))';
454            ' (SELECT ALLOC_PARENT_IDNT from '||V_STG_TBL_NAME||','|| P_SRC_TBL_NAME||' WHERE '||V_STG_TBL_NAME||'.rowid_int = '||P_SRC_TBL_NAME||'.rowid)))';
455       EXECUTE IMMEDIATE v_insert_sql;
456 
457       COMMIT;
458    END IF;--}
459 
460 EXCEPTION
461   WHEN OTHERS THEN
462     RAISE;
463 END ALLOC_MOVE_ERR;
464 
465 
466 PROCEDURE parse_pad_accounts(p_max_level IN NUMBER DEFAULT 10) AS
467     v_elems      account_array;  -- array indexed by level
468     v_elems_ID   account_array;  -- array indexed by level
469     v_counter    NUMBER := 0;
470     v_curr_level NUMBER := 1;
471     v_prev_level NUMBER := 0;
472 
473     -- We want to denormailze the account hierarchy but because of SCD2, there could be records
474     -- with same account but different from/to dates. To remove this problem we need to associate
475     -- by account id and parent account id instead of acocunt code.
476     -- However, account id is generated by the dimension object. Currently the dimension object is
477     -- set as one-level and no hierarchy. Therefore there is no way to produce parent account id
478     -- there. As a result we have to use PL/SQL to add the parent account id after the SCD2 data is generated.
479     --
480     -- generate parent account id from SCD2 data, assuming new open records have higher
481     -- ID than older or closed ones. Couple of note points:
482     -- 1. Some duplicate records are present when looking up manager id. These will have mismatched
483     --    from/to dates and are filtered out by date order by emp_id in the first WHERE clause
484     -- 2. The top accounts are missed out in the first query. They are added in by the second query.
485     CURSOR account_cursor IS
486     SELECT ORG_HCHY_ID, HRCHY_CD, CHILD_ID BSNS_ENT_ID, LEVEL, CHILD_CD BSNS_ENT_CD,
487            SRC_SYS_DT, SRC_SYS_IDNT, EFF_FROM_DT, EFF_TO_DT
488     FROM
489     (
490       SELECT ORG_HCHY_ID, HRCHY_CD, PARENT_ID, PARENT_CD, CHILD_ID, CHILD_CD,
491              SRC_SYS_DT, SRC_SYS_IDNT, EFF_FROM_DT, EFF_TO_DT
492       FROM
493       (
494         SELECT t1.ORG_HCHY_ID ORG_HCHY_ID, t1.HRCHY_CD HRCHY_CD,
495                t1.ORG_BSNS_ENT_ID PARENT_ID, t1.BSNS_ENT_CD PARENT_CD,
496                t2.ORG_BSNS_ENT_ID CHILD_ID, t2.BSNS_ENT_CD CHILD_CD,
497                t2.SRC_SYS_DT SRC_SYS_DT, t2.SRC_SYS_IDNT SRC_SYS_IDNT,
498                t1.EFF_FROM_DT EFF_FROM_DT, t1.EFF_TO_DT, t2.EFF_FROM_DT FROM_DT_2, t2.EFF_TO_DT TO_DT_2
499         FROM DDR_R_ORG_BSNS_ENT t1 INNER JOIN DDR_R_ORG_BSNS_ENT t2
500         ON (t1.BSNS_ENT_CD = t2.BSNS_ENT_PRNT_CD  AND t1.ORG_HCHY_ID = t2.ORG_HCHY_ID)
501       )
502       WHERE NOT ((TO_DT_2 is not null AND TO_DT_2 < EFF_FROM_DT) OR (EFF_TO_DT is not null AND FROM_DT_2 > EFF_TO_DT))
503       UNION
504       (
505         SELECT
506           ORG_HCHY_ID, HRCHY_CD,
507           CASE WHEN BSNS_ENT_PRNT_CD is null THEN null
508           ELSE ORG_BSNS_ENT_ID
509           END PARENT_ID,
510           BSNS_ENT_PRNT_CD PARENT_CD,
511           ORG_BSNS_ENT_ID CHILD_ID,
512           BSNS_ENT_CD CHILD_CD,
513           SRC_SYS_DT, SRC_SYS_IDNT,
514           EFF_FROM_DT, EFF_TO_DT
515         FROM DDR_R_ORG_BSNS_ENT
516         WHERE BSNS_ENT_PRNT_CD is null
517       )
518     )
519     START WITH PARENT_CD is null
520     CONNECT BY PARENT_ID = PRIOR CHILD_ID;
521 
522 
523     -- store previous record columns before level change
524     v_hchy_id NUMBER;
525     v_hchy_cd VARCHAR2(30);
526     v_acct_id NUMBER;
527     v_acct_cd VARCHAR2(30);
528     v_sys_id  VARCHAR2(40);
529     v_sys_dt  DATE;
530 
531     v_sql_stmt VARCHAR2(2048) := '';
532     v_sql_hdr1  VARCHAR2(250) := 'INSERT INTO DDR_R_AOH_LVL_DTL (ORG_HCHY_ID,HRCHY_CD, BSNS_ENT_ID,BSNS_ENT_CD,BSNS_ENT_LEVEL,PRNT1_BSNS_ENT_CD,PRNT1_BSNS_ENT_ID,PRNT2_BSNS_ENT_CD, PRNT2_BSNS_ENT_ID,PRNT3_BSNS_ENT_CD,PRNT3_BSNS_ENT_ID,';
533     v_sql_hdr2  VARCHAR2(250) := 'PRNT4_BSNS_ENT_CD,PRNT4_BSNS_ENT_ID, PRNT5_BSNS_ENT_CD,PRNT5_BSNS_ENT_ID,PRNT6_BSNS_ENT_CD,PRNT6_BSNS_ENT_ID,PRNT7_BSNS_ENT_CD, PRNT7_BSNS_ENT_ID,PRNT8_BSNS_ENT_CD,PRNT8_BSNS_ENT_ID,PRNT9_BSNS_ENT_CD,PRNT9_BSNS_ENT_ID,';
534     v_sql_hdr3 VARCHAR2(250) := 'SRC_SYS_IDNT,SRC_SYS_DT,LAST_UPDATE_DATE,LAST_UPDATED_BY,CREATION_DATE,CREATED_BY,CRTD_BY_DSR, LAST_UPDT_BY_DSR,LAST_UPDATE_LOGIN) VALUES(';
535 
536     v_hchy_cols VARCHAR2(100) :='';
537     v_acct_cols VARCHAR2(100) := '';
538     v_prnt_cols VARCHAR2(1000) := '';
539     v_sys_cols  VARCHAR2(100) := '';
540 
541     v_commit_stmt VARCHAR2(10) := 'commit';
542 
543 BEGIN
544     -- clean up the previous records
545     EXECUTE IMMEDIATE 'truncate table DDR.DDR_R_AOH_LVL_DTL drop storage';
546 
547     -- The logic detects individual branch in the tree:
548     -- 1. Read a row, if it is second row or more, we initialize previous level
549     -- 2. store the account level and code from current record
553     FOR acct_rec IN account_cursor
550     -- 3. if level has decreased, we write all previously accumulated accounts into one record
551     -- 4. clean up and start from current record to start traversing a new branch.
552 
554     LOOP
555         v_counter := v_counter + 1;
556 
557         -- set previous level after one record is read
558         IF (v_counter  > 1)
559         THEN
560             v_prev_level := v_curr_level;
561         END IF;
562 
563         v_curr_level := acct_rec.LEVEL;
564         v_elems(v_counter) := acct_rec.BSNS_ENT_CD;
565         v_elems_id(v_counter) := acct_rec.BSNS_ENT_ID;
566 
567         -- Adjust counter and account array pointer when level is not in order
568         IF ( v_prev_level > 0 AND v_curr_level <= v_prev_level )
569         THEN
570             -- write to table in Elems from 1..Counter
571             v_hchy_cols := v_hchy_id || ',' || '''' || v_hchy_cd || '''' || ',';
572             v_acct_cols := v_acct_id || ',' || '''' || v_acct_cd || '''' || ',' || v_prev_level || ',';
573             FOR p in 1..p_max_level-1
574             LOOP
575                 IF (p < v_counter)
576                 THEN
577                     v_prnt_cols := v_prnt_cols || '''' || v_elems(p) || '''' || ',' || v_elems_id(p) || ',';
578                 ELSE
579                     v_prnt_Cols := v_prnt_Cols || '''' || v_elems(v_counter-1) || '''' || ',' || v_elems_id(v_counter-1) || ',';  -- padding
580                 END IF;
581             END LOOP;
582 
583             v_sys_cols := '''' || v_sys_id || '''' || ',' || 'TO_DATE(' || '''' || v_sys_dt || '''' || '),' || 'SYSDATE' || ', -1,' || 'SYSDATE' || ',-1,' || '''' || USER || '''' || ',' || '''' || USER || '''' || ',-1';
584             v_sql_stmt := v_sql_hdr1 || v_sql_hdr2 || v_sql_hdr3 || v_hchy_cols || v_acct_cols || v_prnt_cols || v_sys_cols || ')';
585             EXECUTE IMMEDIATE v_sql_stmt;
586 
587             -- clean up the statements for next time
588             v_hchy_cols := '';
589             v_acct_cols := '';
590             v_prnt_cols := '';
591             v_sys_cols := '';
592         END IF;
593 
594         -- reset account array to previous level
595         FOR i IN v_curr_level..v_counter
596         LOOP
597             v_elems(i) := null;
598             v_elems_id(i) := null;
599         END LOOP;
600 
601         -- retreat back to the levels corresponding to the record we read
602         v_counter := v_curr_level;
603         v_prev_level := v_curr_level - 1;
604         v_elems(v_counter) := acct_rec.BSNS_ENT_CD;
605         v_elems_id(v_counter) := acct_rec.BSNS_ENT_ID;
606 
607         -- store account attrs used to write to table when level changes as at that time
608         -- cursor already points to the next record.
609         v_hchy_id := acct_rec.ORG_HCHY_ID;
610         v_hchy_cd := acct_rec.HRCHY_CD;
611         v_acct_cd := acct_rec.BSNS_ENT_CD;
612         v_acct_id := acct_rec.BSNS_ENT_ID;
613         v_sys_id := acct_rec.SRC_SYS_IDNT;
614         v_sys_dt := acct_rec.SRC_SYS_DT;
615     END LOOP;
616 
617     -- Last record in cursor is also a lowest level account and ened to be exported
618     IF v_counter > 0
619     THEN
620         v_hchy_cols := v_hchy_id || ',' || '''' || v_hchy_cd || '''' || ',';
621         v_acct_cols := v_acct_id || ',' || '''' || v_acct_cd || '''' || ',' || v_curr_level || ',';
622         FOR p in 1..p_max_level-1
623         LOOP
624             IF (p <= v_counter)  -- note the difference here on counter from with above
625             THEN
626                 v_prnt_cols := v_prnt_cols || '''' || v_elems(p) || '''' || ',' || v_elems_id(p) || ',';
627             ELSE
628                 v_prnt_cols := v_prnt_cols || '''' || v_acct_cd || '''' || ',' || v_acct_id || ',';  -- padding
629             END IF;
630         END LOOP;
631 
632         v_sys_cols := '''' || v_sys_id || '''' || ',' || 'TO_DATE(' || '''' || v_sys_dt || '''' || '),' || 'SYSDATE' || ', -1,' || 'SYSDATE' || ',-1,' || '''' || USER || '''' || ',' || '''' || USER || '''' || ',-1';
633         v_sql_stmt := v_sql_hdr1 || v_sql_hdr2 || v_sql_hdr3 || v_hchy_cols || v_acct_cols || v_prnt_cols || v_sys_cols || ')';
634         EXECUTE IMMEDIATE v_sql_stmt;
635     END IF;
636     EXECUTE IMMEDIATE v_commit_stmt;
637 
638     EXCEPTION
639         WHEN others THEN
640             ROLLBACK;
641 
642 END parse_pad_accounts;
643 
644 
645 PROCEDURE MOVE_ERRORS(p_src_tbl_name IN VARCHAR2,p_err_tbl_name IN VARCHAR2,p_trgt_tbl_name IN VARCHAR2,p_src_typ IN VARCHAR2,p_filter IN VARCHAR2,p_load_id IN NUMBER) IS
646 
647     v_user VARCHAR2(100);
648 
649     CURSOR src_list IS
650       SELECT column_name
651       FROM all_tab_columns
652       WHERE owner = v_user
653       AND table_name = p_src_tbl_name
654       ORDER BY column_id;
655 
656    v_src_col_list code_type;
657    v_err_select VARCHAR2(10000);
658    v_src_select VARCHAR2(10000);
659    v_count NUMBER := 0;
660    v_stg_tbl_name VARCHAR2(30);
661    v_insert_sql VARCHAR2(10000);
662    v_delete_sql VARCHAR2(10000);
663    v_src_filter VARCHAR2(10000);
664 
665 BEGIN
666    v_user := get_user;
667 
668    FOR col IN src_list LOOP
669       v_src_col_list(v_count):=col.column_name;
670       v_src_select := v_src_select || ', ' || v_src_col_list(v_count);
671       v_count := v_count+1;
672    END LOOP;
673       v_src_select := LTRIM(v_src_select,',');
674 
675    --p_src_typ's are 'R'=Reference Flows
676    --p_src_typ's are 'F'=Fact Flows
677    --p_src_typ's are 'S'=Staging Dangling Key Flows
678    --p_src_typ's are 'E'=Extraordinary flows including AOH
679    IF p_src_typ = 'R' THEN
680       v_err_select:=v_src_select || ', LOAD_ID, ERR_REASON, ACTION_FLAG';
681       v_src_select:=v_src_select || ', ' || p_load_id || ', ''Generic Error'', ''N''';
682    ELSIF p_src_typ IN ('F','E') THEN
683       v_err_select:=v_src_select || ', LOAD_ID, ERR_REASON, ACTION_FLAG, SRC_IDNT_FLAG';
684       v_src_select:=v_src_select || ', ' || p_load_id || ', ''Generic Error'', ''N'', ''I''';
685    ELSIF p_src_typ = 'S' THEN
686       v_err_select:=v_src_select || ', ERR_REASON, ACTION_FLAG, SRC_IDNT_FLAG';
687       v_src_select:='';
688       FOR i IN v_src_col_list.FIRST..v_src_col_list.LAST LOOP
689          IF v_src_col_list(i)='LOAD_ID' THEN
690             v_src_select:=v_src_select || ', ' || p_load_id;
691          ELSE
692             v_src_select := v_src_select || ', ' || v_src_col_list(i);
693          END IF;
694       END LOOP;
695       v_src_select := LTRIM(v_src_select,',');
696       v_src_select:=v_src_select || ', ''Generic Error'', ''N'', ''S''';
697       /* For forecast flow, taking out unused column */
698       IF p_src_tbl_name = 'DDR_S_SLS_FRCST_ITEM' THEN
699          v_src_select := REPLACE(v_src_select,', RTL_BSNS_UNIT_CD','');
700          v_err_select := REPLACE(v_err_select,', RTL_BSNS_UNIT_CD','');
701       END IF;
702    END IF;
703 
704    v_stg_tbl_name:='I$_' || p_trgt_tbl_name;
705 
706    IF p_filter IS NOT NULL THEN --{
707       v_src_filter:='('||p_filter||')';
708    ELSE
709       v_src_filter:='(1=1)';
710    END IF;--}
711 
712    /* Creating the INSERT SQL statement */
713    v_insert_sql:='INSERT INTO '||p_err_tbl_name||' ( '||v_err_select||') SELECT '||v_src_select||' FROM '||p_src_tbl_name||' WHERE NOT EXISTS ( '||
714         ' SELECT ROWID_INT FROM '||v_stg_tbl_name||' WHERE '||v_stg_tbl_name||'.ROWID_INT = '||p_src_tbl_name||'.rowid ) AND '||v_src_filter;
715 
716    EXECUTE IMMEDIATE v_insert_sql;
717    COMMIT;
718 
719    IF p_src_typ IN ('R','E') THEN
720       /* Creating the DELETE SQL statement for reference flows only*/
721       v_delete_sql:='DELETE FROM ' || p_src_tbl_name || ' WHERE (REC_ID) IN (SELECT REC_ID FROM ' || p_src_tbl_name ||
722       ' WHERE NOT EXISTS ( SELECT REC_ID FROM ' || v_stg_tbl_name || ' WHERE ' || v_stg_tbl_name || '.REC_ID = ' || p_src_tbl_name || '.REC_ID ) AND '||v_src_filter||')';
723 
724       EXECUTE IMMEDIATE v_delete_sql;
725       COMMIT;
726    END IF;
727 
728 EXCEPTION
729   WHEN OTHERS THEN
730     RAISE;
731 END MOVE_ERRORS;
732 
733 
734 PROCEDURE TRUNC_TABLE ( p_table IN VARCHAR2 ) IS
735 
736 v_user VARCHAR2(100);
737 v_trunc_sql VARCHAR2(1000);
738 
739 BEGIN
740   v_user := get_user;
741 
742   v_trunc_sql := 'truncate table '|| v_user||'.'||p_table || ' drop storage';
743   EXECUTE IMMEDIATE v_trunc_sql;
744 
745 END TRUNC_TABLE;
746 
747 
748 END DDR_ODI;