DBA Data[Home] [Help]

PACKAGE BODY: APPS.EDW_FACT_SV

Source


1 Package Body EDW_FACT_SV AS
2 /* $Header: EDWVFCTB.pls 120.0 2005/06/01 15:01:55 appldev noship $ */
3 l_directory Varchar2(30) := '/sqlcom/log';
4 g_flex_view_name varchar2(300) := null;
5 g_collection_view_name varchar2(300) := null;
6 g_generated_view_name varchar2(300) := null;
7 g_acct_flex_exists boolean := false;
8 
9 newline varchar2(10) := '
10 ';
11 tabb varchar2(40) := '	';
12 
13 cid number;
14 
15 TYPE t_view_text_table is table of varchar2(32760) index by binary_integer;
16 g_view_text_table t_view_text_table;
17 g_view_table_num number:=1;
18 g_long_stmt_flag boolean:=false;
19 /* ------------------------------------------------------------------------
20 
21      given a fact, return the source view name
22 
23 ------------------------------------------------------------------------  */
24 
25 Procedure getViewNameForFact(fact_name in varchar2) IS
26 viewname 	VARCHAR2(300);
27 
28 CURSOR  c_getViewNamesForFact(p_fact_name in varchar2) IS
29 	SELECT flex_view_name, generated_view_name, collection_view_name
30 	FROM edw_source_views
31 	WHERE upper(object_name) = p_fact_name
32 	AND version =edw_gen_view.g_version;
33 
34 BEGIN
35 	IF (g_log) THEN
36 		edw_gen_view.indentBegin;
37 		edw_gen_view.writelog(newline);
38 		edw_gen_view.writelog('Inside getViewNameForFact');
39 	END IF;
40 
41 	OPEN c_getViewNamesForFact(fact_name);
42 	FETCH c_getViewNamesForFact into g_flex_view_name,
43 		g_generated_view_name, g_collection_view_name;
44 	CLOSE c_getViewNamesForFact ;
45 
46 	IF (g_generated_view_name IS NULL OR g_flex_view_name IS NULL OR
47 			g_collection_view_name IS NULL) THEN
48 		edw_gen_view.g_success := false;
49 		edw_gen_view.g_error := 'View Names not seeded for ' ||fact_name;
50 		raise edw_gen_view.viewgen_exception;
51 
52 	END IF;
53 
54 	IF (g_log) THEN
55 		edw_gen_view.writelog('   Flex view is:'||g_flex_view_name);
56 		edw_gen_view.writelog('   Generated view is:'||g_generated_view_name);
57 		edw_gen_view.writelog('   Collection view is:'||g_collection_view_name);
58 		edw_gen_view.writelog('Completed getViewNameForFact');
59 		edw_gen_view.indentEnd;
60 
61 	END IF;
62 
63 
64 END;
65 
66 
67 Procedure generateViewForFact(fact_name IN VARCHAR2) IS
68 
69 srcview 	VARCHAR2(32760);
70 l_temp_stmt     VARCHAR2(32760);
71 l_write_view_counter INTEGER:=0;
72 l_build_stmt_counter integer:=0;
73 v_col 		DBMS_SQL.VARCHAR2_TABLE;
74 v_colType 	DBMS_SQL.VARCHAR2_TABLE;
75 v_retCode 	INTEGER;
76 nColCount 	INTEGER := 0;
77 nOuterLoopCount INTEGER := 0;
78 nInnerLoopCount INTEGER := 0;
79 attColumns 	edw_gen_view.tab_att_maps;
80 multiAttList	edw_gen_view.tab_multi_att_list;
81 flexColumns 	edw_gen_view.tab_flex_att_maps;
82 fkColumns   	edw_gen_view.tab_fact_flex_fk_maps;
83 bColumnMapped 	BOOLEAN := false;
84 curColumn 	VARCHAR2(300) := NULL;
85 curColType 	VARCHAR2(300) := NULL;
86 stmt 		VARCHAR2(10000) := NULL;
87 decodeClause 	VARCHAR2(30000) := NULL;
88 
89 nLoopCounter 	INTEGER := 0;
90 
91 Cursor C_Skip_Columns(p_object_short_name VARCHAR2) IS
92   select attribute_name, attribute_type
93   from edw_attribute_properties
94   where skip_flag = 'Y'
95     and object_short_name = p_object_short_name;
96 
97 Skip_Columns C_Skip_Columns%ROWTYPE;
98 
99 Type T_skip_columns_table is table  of
100 C_Skip_Columns%rowtype
101 index by binary_integer;
102 
103 skip_columns_table T_skip_columns_table;
104 l_count INTEGER := 0;
105 
106 BEGIN
107 
108 	g_flex_view_name := null;
109 	g_collection_view_name := null;
110 	g_generated_view_name := null;
111 	g_acct_flex_exists := false;
112 	g_view_table_num :=1;
113 	--alter session set global_names=false;
114 	edw_misc_util.globalNamesOff;
115 
116 
117 
118 	IF (g_log) THEN
119 		edw_gen_view.indentBegin;
120 		edw_gen_view.writelog('Inside generateViewForFact');
121 	END IF;
122 
123 
124 	getViewNameForFact(upper(fact_name));
125 
126 
127 	/* figure out which attributes are mapped */
128 	srcview := 'CREATE OR REPLACE FORCE VIEW '||g_collection_view_name||' AS SELECT ';
129 
130 	nColCount := edw_gen_view.getColumnCountForView(g_collection_view_name);
131 
132 
133 	IF (NOT edw_gen_view.g_success) THEN
134 		return;
135 	END IF;
136 
137 	IF (nColCount = 0 ) THEN
138 		edw_gen_view.g_success := false;
139 		edw_gen_view.g_error := 'Error! No. of columns for ' ||g_collection_view_name||
140 			'@'||edw_gen_view.g_source_db_link||' is zero!!!';
141 
142 		IF (g_log) THEN
143 			edw_gen_view.writelog('ERROR...'||edw_gen_view.g_error);
144 		END IF;
145 
146 		raise edw_gen_view.viewgen_exception;
147 		RETURN;
148 	END IF;
149 
150 
151 	stmt := ' SELECT distinct column_name , data_type FROM all_tab_columns@'||edw_gen_view.g_source_db_link;
152 	stmt := stmt||' WHERE table_name = upper('''||g_collection_view_name
153 		||''') AND owner = '''||edw_gen_view.g_apps_schema||'''';
154 
155 
156 BEGIN
157 	cid := DBMS_SQL.open_cursor;
158 
159 	DBMS_SQL.PARSE(cid, stmt, dbms_sql.native);
160 	DBMS_SQL.DEFINE_ARRAY(cid, 1, v_col, nColCount, 1);
161   	DBMS_SQL.DEFINE_ARRAY(cid, 2, v_colType, nColCount, 1);
162 	v_retCode := DBMS_SQL.EXECUTE_AND_FETCH(cid);
163 	DBMS_SQL.COLUMN_VALUE(cid, 1, v_col);
164     DBMS_SQL.COLUMN_VALUE(cid, 2, v_colType);
165 	DBMS_SQL.CLOSE_CURSOR(cid);
166 
167 
168 
169 	edw_gen_view.getColumnMaps(fact_name, attColumns, multiAttList,
170 					flexColumns, fkColumns);
171 
172 	IF (NOT edw_gen_view.g_success) THEN
173 		return;
174 	END IF;
175 
176 
177 -- build skip_columns_table here
178     l_count := 1;
179     open C_Skip_Columns(fact_name);
180     loop
181         fetch C_Skip_Columns into skip_columns;
182         exit when C_Skip_Columns%NOTFOUND;
183         skip_columns_table (l_count).attribute_name := skip_columns.attribute_name;
184         skip_columns_table (l_count).attribute_type := skip_columns.attribute_type;
185         l_count := l_count + 1;
186     end loop;
187 
188 	WHILE nOuterLoopCount < nColCount LOOP
189         nOuterLoopCount := nOuterLoopCount + 1;
190     	curColumn    := v_col(nOuterLoopCount);
191         curColType   := v_colType(nOuterLoopCount);
192 
193         /* check if current column is a skipped column */
194 	  IF (curColumn LIKE 'USER_ATTRIBUTE%' OR curColumn LIKE 'USER_FK%'
195 		OR curColumn like 'USER_MEASURE%' OR curColumn LIKE 'GL_ACCT%_FK%') THEN
196 	      null;
197 	  ELSE
198 	      nInnerLoopCount := 1;
199 	      IF (skip_columns_table.count > 0) THEN
200 
201     		LOOP
202 	   	  IF (skip_columns_table(nInnerLoopCount).attribute_name = curColumn
203 	             AND skip_columns_table(nInnerLoopCount).attribute_type = 'A'
204         	     )
205                	  OR (skip_columns_table(nInnerLoopCount).attribute_name = curColumn || '_KEY'
206                      AND skip_columns_table(nInnerLoopCount).attribute_type = 'F'
207                      ) THEN
208 
209                     if (skip_columns_table(nInnerLoopCount).attribute_type = 'F') then
210 
211                       l_temp_stmt :=  ',' || newline || ' ''NA_EDW'' ' || curColumn ;
212                     elsif (curColType = 'NUMBER') then
213                       l_temp_stmt :=  ',' || newline || ' to_number(null) ' || curColumn;
214 
215                     elsif (skip_columns_table(nInnerLoopCount).attribute_type = 'A') then
216                       l_temp_stmt :=  ',' || newline || ' null ' || curColumn;
217 
218                     end if;
219 
220                 if (length(srcview)+length(l_temp_stmt)> 32760) then
221                     g_view_text_table(g_view_table_num):= srcview;
222                     srcview:=null;
223 		    if g_log then
224                         edw_gen_view.writelog('View text is longer than 32760.');
225                         edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
226                     end if;
227                     g_view_table_num:= g_view_table_num+1;
228                     g_long_stmt_flag:=true;
229                 end if;
230                 srcview := srcview || l_temp_stmt;
231 
232                 bColumnMapped := true;  -- to skip the part after nomatch
233                 goto nomatch;
234               end if;
235 	      EXIT WHEN  nInnerLoopCount = skip_columns_table.last;
236 	      nInnerLoopCount := nInnerLoopCount + 1;
237             end loop;
238            end if;
239           end if;
240 
241 		IF nOuterLoopCount >1 THEN
242                         l_temp_stmt:= ', '||newline;
243 
244                         if (length(srcview)+length(l_temp_stmt)> 32760) then
245                            g_view_text_table(g_view_table_num):= srcview;
246                            srcview:=null;
247 		           if g_log then
248                               edw_gen_view.writelog('View text is longer than 32760.');
249                               edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
250                            end if;
251                            g_view_table_num:= g_view_table_num+1;
252                            g_long_stmt_flag:=true;
253                        end if;
254                        srcview := srcview || l_temp_stmt;
255 		END IF;
256 		IF (g_log) THEN
257 		edw_gen_view.writelog('Processing column ' || curColumn);
258 		END IF;
259 		/* need to process only if its a user attribute or user fk */
260 
261 		IF (curColumn LIKE 'USER_ATTRIBUTE%' OR curColumn LIKE 'USER_FK%'
262 			OR curColumn like 'USER_MEASURE%' OR curColumn LIKE 'GL_ACCT%_FK%') THEN
263 			null;
264 		ELSE
265 
266 			goto nomatch;
267 		END IF;
268 
269 		/* see if columns have been mapped to a source attribute */
270 		nInnerLoopCount := 1;
271 		IF (attColumns.count > 0) THEN
272 
273 
274 		  LOOP
275 
276 			IF (attColumns(nInnerLoopCount).attribute_name = curColumn) THEN
277 			 	bColumnMapped := true;
278 				IF (g_log) THEN
279 				        edw_gen_view.writelog('	Attributes mapped to a single attribute exist');
280 					edw_gen_view.writelog('	'||curColumn||' is of datatype '||attColumns(nInnerLoopCount).datatype);
281 				END IF;
282 				IF (attColumns(nInnerLoopCount).datatype <> 'DATE') THEN
283 				   IF (g_log) THEN
284 				   	edw_gen_view.writelog('	not a date column ');
285 				   END IF;
286 
287 
288                                    l_temp_stmt:=  'a.'||attColumns(nInnerLoopCount).source_attribute||' '||curColumn ;
289 				  IF (g_log) THEN
290 				   edw_gen_view.writelog('	'||attColumns(nInnerLoopCount).source_attribute||' '||curColumn ||newline||newline);
291 				  END IF;
292                                    if (length(srcview)+length(l_temp_stmt)> 32760) then
293                                      g_view_text_table(g_view_table_num):= srcview;
294                                      srcview:=null;
295 		                     if g_log then
296                                         edw_gen_view.writelog('View text is longer than 32760.');
297                                         edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
298                                      end if;
299                                      g_view_table_num:= g_view_table_num+1;
300                                      g_long_stmt_flag:=true;
301                                    end if;
302                                    srcview := srcview || l_temp_stmt;
303 				ELSE
304 				   IF (g_log) THEN
305 				   	edw_gen_view.writelog( 'and so doing a to_char');
306 				   END IF;
307 				   l_temp_stmt :=' to_char(a.'||attColumns(nInnerLoopCount).source_attribute||' , ''mm/dd/yyyy hh24:mi:ss'') '||' '||curColumn ;
308                                    if (length(srcview)+length(l_temp_stmt)> 32760) then
309                                      g_view_text_table(g_view_table_num):= srcview;
310                                      srcview:=null;
311 		                     if g_log then
312                                         edw_gen_view.writelog('View text is longer than 32760.');
313                                         edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
314                                      end if;
315                                      g_view_table_num:= g_view_table_num+1;
316                                      g_long_stmt_flag:=true;
317                                    end if;
318                                    srcview := srcview || l_temp_stmt;
319 				END IF;
320 				goto nomatch;
321 
322 			END IF;
323 			EXIT WHEN  nInnerLoopCount = attColumns.last;
324 			nInnerLoopCount := nInnerLoopCount + 1;
325 		  END LOOP;
326 		END IF;
327 
328         nInnerLoopCount := 1;
329 		IF (multiAttList.count > 0) THEN
330 			LOOP
331 
332 			 	IF (multiAttList(nInnerLoopCount).attribute_name = curColumn) THEN
333 			 		bColumnMapped := true;
334 					l_temp_stmt := edw_gen_view.getNvlClause(fact_name, null,
335 						       edw_gen_view.g_instance , curColumn)||' '||curColumn ;
336 			IF (g_log) THEN
337                     edw_gen_view.writelog('getNvlClause returned : '||l_temp_stmt);
338 			END IF;
339                                         if (length(srcview)+length(l_temp_stmt)> 32760) then
340                                           g_view_text_table(g_view_table_num):= srcview;
341                                           srcview:=null;
342 		                          if g_log then
343                                             edw_gen_view.writelog('View text is longer than 32760.');
344                                             edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
345                                           end if;
346                                            g_view_table_num:= g_view_table_num+1;
347                                            g_long_stmt_flag:=true;
348                                         end if;
349                                         srcview := srcview || l_temp_stmt;
350 					goto nomatch;
351 			 	END IF;
352 				IF (NOT edw_gen_view.g_success) THEN
353 				return;
354 				END IF;
355 
356 			 	EXIT WHEN  nInnerLoopCount = multiAttList.last;
357 				nInnerLoopCount := nInnerLoopCount + 1;
358 			END LOOP;
359 		END IF;
360 
361 		/* see if columns have been mapped to a source flex field */
362 
363 		nInnerLoopCount := 1;
364 		IF (flexColumns.count > 0) THEN
365 
366 		  LOOP
367 
368  			IF (flexColumns(nInnerLoopCount).attribute_name = curColumn) THEN
369 			 	bColumnMapped := true;
370 			 	-- decode flex
371 			 	decodeClause := edw_gen_view.getDecodeClauseForFlexCol(
372 					g_flex_view_name, curColumn,
373 					flexColumns(nInnerLoopCount).id_flex_code,
374 					flexColumns(nInnerLoopCount).flex_field_type);
375 			 	l_temp_stmt :=  decodeClause||' '||curColumn;
376                                 if (length(srcview)+length(l_temp_stmt)> 32760) then
377                                     g_view_text_table(g_view_table_num):= srcview;
378                                     srcview:=null;
379 		                    if g_log then
380                                        edw_gen_view.writelog('View text is longer than 32760.');
381                                        edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
382                                     end if;
383                                     g_view_table_num:= g_view_table_num+1;
384                                     g_long_stmt_flag:=true;
385                                 end if;
386                                 srcview := srcview || l_temp_stmt;
387 			 	goto nomatch;
388 			END IF;
389 			IF (NOT edw_gen_view.g_success) THEN
390 				return;
391 			END IF;
392 
393 			EXIT WHEN  nInnerLoopCount= flexColumns.last;
394 			nInnerLoopCount := nInnerLoopCount + 1;
395  		   END LOOP;
396 		END IF;
397 
401 		IF (fkColumns.count > 0) THEN
398 		/* see if fk columns have been mapped to a flex dimension */
399 
400 		nInnerLoopCount := 1;
402 
403 		  LOOP
404 		 	IF (fkColumns(nInnerLoopCount).fk_physical_name = curColumn OR fkColumns(nInnerLoopCount).fk_physical_name = curColumn||'_KEY') THEN
405 			    bColumnMapped := true;
406 			    decodeClause := getDecodeClauseForFlexFK(fact_name, curColumn);
407 			    l_temp_stmt:= decodeClause||' '||curColumn;
408                             if (length(srcview)+length(l_temp_stmt)> 32760) then
409                                 g_view_text_table(g_view_table_num):= srcview;
410                                 srcview:=null;
411                                 if g_log then
412                                    edw_gen_view.writelog('View text is longer than 32760.');
413                                    edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
414                                 end if;
415                                 g_view_table_num:= g_view_table_num+1;
416                                 g_long_stmt_flag:=true;
417                             end if;
418                             srcview := srcview || l_temp_stmt;
419 			    goto nomatch;
420 			END IF;
421 
422 			IF (NOT edw_gen_view.g_success) THEN
423 				return;
424 			END IF;
425 
426 			 EXIT WHEN  nInnerLoopCount= fkColumns.last;
427 			 nInnerLoopCount := nInnerLoopCount + 1;
428  		  END LOOP;
429 		END IF;
430 <<nomatch>>
431 		IF (bColumnMapped = false) THEN
432 			IF (curColumn like 'USER_FK%' or curColumn like 'GL_ACCT%FK%') THEN
433         		    l_temp_stmt:='''NA_EDW'''||' '||v_col(nOuterLoopCount);
434                             if (length(srcview)+length(l_temp_stmt)> 32760) then
435                                 g_view_text_table(g_view_table_num):= srcview;
436                                 srcview:=null;
437                                 if g_log then
438                                    edw_gen_view.writelog('View text is longer than 32760.');
439                                    edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
440                                 end if;
441                                 g_view_table_num:= g_view_table_num+1;
442                                 g_long_stmt_flag:=true;
443                             end if;
444                             srcview := srcview || l_temp_stmt;
445 			END IF;
446 			IF (curColumn like 'USER_ATTRIBUTE%' or curColumn like 'USER_MEASURE%') THEN
447 		    	    l_temp_stmt:='null '||v_col(nOuterLoopCount);
448                             if (length(srcview)+length(l_temp_stmt)> 32760) then
449                                 g_view_text_table(g_view_table_num):= srcview;
450                                 srcview:=null;
451                                 if g_log then
452                                    edw_gen_view.writelog('View text is longer than 32760.');
453                                    edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
454                                 end if;
455                                 g_view_table_num:= g_view_table_num+1;
456                                 g_long_stmt_flag:=true;
457                             end if;
458                             srcview := srcview || l_temp_stmt;
459                         END IF;
460 
461 			IF (curColumn NOT like 'USER_ATTRIBUTE%' AND curColumn NOT like 'GL_ACCT%FK%' AND curColumn NOT like 'USER_MEASURE%' AND curColumn NOT like 'USER_FK%' ) THEN
462 	  		    l_temp_stmt:=' a.'||v_col(nOuterLoopCount);
463                             if (length(srcview)+length(l_temp_stmt)> 32760) then
464                                 g_view_text_table(g_view_table_num):= srcview;
465                                 srcview:=null;
466                                 if g_log then
467                                    edw_gen_view.writelog('View text is longer than 32760.');
468                                    edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
469                                 end if;
470                                 g_view_table_num:= g_view_table_num+1;
471                                 g_long_stmt_flag:=true;
472                             end if;
473                             srcview := srcview || l_temp_stmt;
474 			END IF;
475 		END IF;
476 		bColumnMapped := false;
477 	null;
478 	END LOOP;
479 
480 
481         l_temp_stmt:= newline||' FROM '||g_generated_view_name||' a';
482         if (length(srcview)+length(l_temp_stmt)> 32760) then
483             g_view_text_table(g_view_table_num):= srcview;
484             srcview:=null;
485             if g_log then
486                edw_gen_view.writelog('View text is longer than 32760.');
487                edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
488             end if;
489             g_view_table_num:= g_view_table_num+1;
490             g_long_stmt_flag:=true;
491         end if;
492         srcview := srcview || l_temp_stmt;
493 
494 
495 	IF (g_acct_flex_exists) THEN
496 
497 		l_temp_stmt:= ', '||newline||' edw_local_set_of_books b,  edw_local_equi_set_of_books c, edw_local_set_of_books d '|| newline||
498 		' where a.set_of_books_id = b.set_of_books_id (+) '||newline||
499 		/*' and b.instance(+) = '||''''|| edw_gen_view.g_instance ||''''||newline||*/
500 		' and b.edw_set_of_books_id = c.edw_set_of_books_id (+) '||
504                      g_view_text_table(g_view_table_num):= srcview;
501 		' and c.equi_set_of_books_id = d.edw_set_of_books_id (+)';
502 
503                  if (length(srcview)+length(l_temp_stmt)> 32760) then
505                      srcview:=null;
506                      if g_log then
507                         edw_gen_view.writelog('View text is longer than 32760.');
508                         edw_gen_view.writelog('View Text stored in the '|| g_view_table_num||'th element of the view text table.');
509                      end if;
510                      g_long_stmt_flag:=true;
511                  end if;
512                  srcview := srcview || l_temp_stmt;
513 
514 	END IF;
515 
516         if g_log then
517 
518           if (g_long_stmt_flag) then
519             for l_write_view_counter in 1 .. g_view_text_table.count loop
520 		IF(g_log) THEN
521 		edw_gen_view.writelog( g_view_text_table(l_write_view_counter));
522 		edw_gen_view.writeoutline('/* Writing Part  '||l_write_view_counter||' of the view */');
523                 edw_gen_view.writeout( g_view_text_table(l_write_view_counter));
524 		END IF;
525             end loop;
526           end if;
527 
528 	  IF (g_log) THEN
529 	  edw_gen_view.writeoutline('/* Writing remaining piece of view */');
530 	  edw_gen_view.writeOutline(srcview);
531 	  edw_gen_view.writelog(newline||newline);
532 	  edw_gen_view.writelog('View formation complete.');
533           --edw_gen_view.writelog(srcview);
534           edw_gen_view.writeOutLine('/');
535           edw_gen_view.writeOutLine('EXIT;');
536 	 END IF;
537        end if;
538 
539 
540 
541 	IF (NOT edw_gen_view.g_success) THEN
542 		return;
543 	END IF;
544 
545         if (not g_long_stmt_flag) then
546       	   IF (g_log) THEN
547 		edw_gen_view.writelog('Short text. Call edw_gen_view.createView');
548 	   END IF;
549   	   edw_gen_view.createView(srcview, g_collection_view_name);
550         else
551      	   IF (g_log) THEN
552 		edw_gen_view.writelog('Long text. Call edw_gen_view.createLongView');
553 	   END IF;
554 
555            /*---------------------------------------------------------------------------
556              cut the view text into 256 chars chunks and call edw_gen_view.buildViewStmt
557             ----------------------------------------------------------------------------*/
558            l_build_stmt_counter:=0;
559            for l_write_view_counter in 1 .. g_view_text_table.count loop
560                l_temp_stmt:= g_view_text_table(l_write_view_counter);
561 
562  	       while (length(l_temp_stmt) >256 ) loop
563                  l_build_stmt_counter:= l_build_stmt_counter +1;
564                  edw_gen_view.BuildViewStmt(substr(l_temp_stmt,1,256), l_build_stmt_counter);
565                  l_temp_stmt:= substr(l_temp_stmt,257);
566                end loop;
567                l_build_stmt_counter:= l_build_stmt_counter +1;
568                edw_gen_view.BuildViewStmt(l_temp_stmt, l_build_stmt_counter);
569            end loop;
570            l_temp_stmt := srcview;
571  	   while (length(l_temp_stmt) >256 ) loop
572               l_build_stmt_counter:= l_build_stmt_counter +1;
573               edw_gen_view.BuildViewStmt(substr(l_temp_stmt,1,256), l_build_stmt_counter);
574               l_temp_stmt:= substr(l_temp_stmt,257);
575            end loop;
576            l_build_stmt_counter:= l_build_stmt_counter +1;
577            edw_gen_view.BuildViewStmt(l_temp_stmt, l_build_stmt_counter);
578 
579    	   edw_gen_view.createLongView(g_collection_view_name, 1, l_build_stmt_counter);
580         end if;
581 
582 	IF (NOT edw_gen_view.g_success) THEN
583 
584 		return;
585 	END IF;
586 
587 	IF (g_log) THEN
588 		edw_gen_view.writelog('Completed generateViewForFact');
589 		edw_gen_view.indentEnd;
590 	END IF;
591 END;
592 
593 END;
594 
595 
596 /* ------------------------------------------------------------------------
597 
598      given a fact FK that is mapped, return the decode clause for this fk
599 
600 ------------------------------------------------------------------------  */
601 
602 FUNCTION getDecodeClauseForFlexFK( pFactName IN VARCHAR2, pAttributeName IN VARCHAR2) RETURN  VARCHAR2 IS
603 sPrefix 	        VARCHAR2(100) := NULL;
604 sDecodeClause 	    VARCHAR2(30000) := NULL;
605 nCount 		        NUMBER := 1;
606 l_gen_seg_name 	    VARCHAR2(30):= NULL;
607 l_parent_seg_name 	VARCHAR2(30):= NULL;
608 l_parent_struct_num NUMBER := 0;
609 l_parent_struct_name  VARCHAR2(30):= NULL;
610 cid 		        NUMBER := 0;
611 l_dummy 	        NUMBER := 0;
612 
613 CURSOR 		c   IS SELECT  fk_physical_name, b.dimension_short_name dimension_short_name,
614        		a.value_set_id value_set_id, segment_name, flex_field_type,
615 	        structure_num , value_set_type, instance_code, id_flex_code, structure_name, parent_value_set_id
616 	        FROM edw_flex_seg_mappings a, edw_fact_flex_fk_maps b
617 	        WHERE b.fact_short_name = pFactName
618 	        AND b.enabled_flag = 'Y'
619 	        AND b.dimension_short_name = a.dimension_short_name
620 		AND a.instance_code = edw_gen_view.g_instance
621 		        AND (b.fk_physical_name = pAttributeName
622 			or b.fk_physical_name = pAttributeName||'_KEY')
623 		AND NOT EXISTS( select 1 from edw_flex_seg_mappings c
624 				where c.parent_value_set_id = a.value_set_id
625 				and a.instance_code = c.instance_code
626 				and a.dimension_short_name = c.dimension_short_name
630 TYPE CurTyp IS REF CURSOR;
627 				and a.structure_num = c.structure_num);
628 cRec		c%ROWTYPE;
629 stmt        varchar2(200);
631 cv   CurTyp;
632 
633 l_structure_col varchar2(100) := null;
634 dependantVSExists boolean := false;
635 sDecodePrefix varchar2(100) := null;
636 tempvar varchar2(300);
637 BEGIN
638 
639 	IF (g_log) THEN
640 	edw_gen_view.indentBegin;
641 
642 	edw_gen_view.writelog('Inside getDecodeClauseForFlexFK');
643 	edw_gen_view.writelog('     Parameter pFactname:'||pFactName);
644 	edw_gen_view.writelog('     Parameter pAttributeName:'||pAttributeName);
645 	END IF;
646 
647 	OPEN c;
648 	FETCH c  INTO cRec;
649 
650 	sPrefix := edw_gen_view.getFlexPrefix(g_flex_view_name, cRec.id_flex_code);
651     sDecodePrefix := ' DECODE('||sPrefix||'_CONTEXT, '||newline||'        ';
652 	--sDecodeClause := ' DECODE('||sPrefix||'_CONTEXT, '||newline||'        ';
653 
654 	LOOP
655 
656 		EXIT WHEN c%NOTFOUND;
657 		IF(nCount > 1) THEN
658 			sDecodeClause := sDecodeClause ||','||newline||'	';
659 		END IF;
660 
661 		------------------------------------------------
662 		l_gen_seg_name := cRec.segment_name;
663 
664 		IF (g_log) THEN
665 			edw_gen_view.writelog('l_gen_seg_name is :'|| l_gen_seg_name);
666 			edw_gen_view.writelog('calling formSegmentName');
667 		END IF;
668 
669 		l_gen_seg_name := edw_gen_view.formSegmentName(sPrefix, cRec.segment_name, cRec.structure_num, pFactName, cRec.flex_field_type);
670 
671         IF (upper(cRec.value_set_type) = 'D' ) THEN /* Dependant Value Set, need parent segment name also */
672                 stmt := ' SELECT segment_name, structure_num FROM edw_flex_seg_mappings'||
673                         ' WHERE value_set_id = :s1 AND ';
674 
675                 IF (cRec.flex_field_type = 'D') THEN /* Descr Flex */
676                     stmt := stmt ||' structure_name = :s2 ';
677                     open cv for stmt using cRec.parent_value_set_id, cRec.structure_name ;
678                     fetch cv into l_parent_seg_name, l_parent_struct_name ;
679                     close cv;
680                 ELSIF   /* we need to consider accounting flex field as well (bug 2245373)*/
681                    (cRec.flex_field_type = 'K' OR cRec.flex_field_type = 'A') THEN /* Key Flex */
682                     stmt := stmt ||' structure_num = :s2 ';
683                     open cv for stmt using cRec.parent_value_set_id, cRec.structure_num;
684                     fetch cv into l_parent_seg_name, l_parent_struct_num ;
685                     close cv;
686                 END IF;
687                 l_parent_seg_name := edw_gen_view.formSegmentName(sPrefix, l_parent_seg_name, cRec.structure_num, pFactName, cRec.flex_field_type);
688 
689 		IF (g_log) THEN
690 	                edw_gen_view.writelog('Parent segment is :'|| l_parent_seg_name);
691 		END IF;
692         END IF;
693 
694 		-------------------------------------------------
695 	IF (g_log) THEN
696 	        edw_gen_view.writelog('dimension name is :'|| cRec.dimension_short_name);
697 	END IF;
698 
699 
700 		IF (cRec.dimension_short_name LIKE 'EDW_GL_ACCT%_M' ) THEN /* A/c Flex dim */
701 			/* Different FK format, to support Phase 1 */
702 
703 			 g_acct_flex_exists := true;
704 			sDecodeClause :=sDecodeClause ||''''||cRec.structure_num||''','||
705 			 newline||'    DECODE(b.set_of_books_id, null, ''NA_EDW'', '||
706 		    	 newline||' 	 DECODE(c.edw_set_of_books_id, null, '||
707 			 newline||'	   DECODE("'||l_gen_seg_name||'", null, ''NA_EDW'','||
708 			 newline||'	 	"'||l_gen_seg_name||'"';
709 			sDecodeClause := sDecodeClause||'||'||
710 				''''||'-'||''''||'|| a.set_of_books_id ';
711 			sDecodeClause := sDecodeClause||'||'||''''||'-'||''''||'||'
712 			||''''||edw_gen_view.g_instance||''''||'),';
713 
714 			sDecodeClause := sDecodeClause||
715 			newline||'	   DECODE("'||l_gen_seg_name||'", null, ''NA_EDW'','||
716 			 newline||'	 	"'||l_gen_seg_name||'"';
717 			sDecodeClause := sDecodeClause||'||'||
718 				''''||'-'||''''||'|| d.set_of_books_id ';
719 
720 			sDecodeClause := sDecodeClause||'||'||''''||'-'||''''||'||'
721 			||'d.instance)'||newline||
722 			'	)'||
723 			'     )';
724 
725 
726 		ELSE
727 			IF (g_log) THEN
728 			edw_gen_view.writelog('Mapped to a non a/c flex dimension ');
729 			edw_gen_view.writelog('Structure name is : '||cRec.structure_name);
730 			END IF;
731 
732 			IF (cRec.flex_field_type = 'D') THEN /* Descr Flex */
733 			IF (g_log) THEN
734 			  edw_gen_view.writelog('struct is : '||cRec.structure_name);
735 			END IF;
736 			tempvar := replace(cRec.structure_name, '''', '''''');
737 			IF (g_Log) THEN
738 		  	  edw_gen_view.writelog('struct after replace is : '||tempvar);
739 			END IF;
740 
741                 IF (cRec.value_set_type = 'D') THEN /* Dependant VS, so different FK Structure */
742                     sDecodeClause := sDecodeClause||'''';
743 
744 			sDecodeClause := sDecodeClause||tempvar||''''||
745     				', DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
746         	   		||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
747 		          	'"'||l_parent_seg_name||'"'||'||'':''||"'||l_gen_seg_name||'"'||')';
748                     dependantVSExists := true;
749                 ELSE
750 				    sDecodeClause := sDecodeClause||''''||tempvar||''''||
754                 END IF; /*  value_set_type = 'D' */
751     				', DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
752 	           		||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
753         			'"'||l_gen_seg_name||'"'||')';
755 			ELSE
756                 IF (cRec.value_set_type = 'D') THEN /* Dependant VS, so different FK Structure */
757                     sDecodeClause := sDecodeClause||''''||cRec.structure_num||''''||
758 			     	', DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
759         			||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
760 		          	'"'||l_parent_seg_name||'"'||'||'':''||"'||l_gen_seg_name||'"'||')';
761                     dependantVSExists := true;
762                 ELSE
763 		      		sDecodeClause := sDecodeClause||''''||cRec.structure_num||''''||
764 			     	', DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
765         			||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
766 		          	'"'||l_gen_seg_name||'"'||')';
767                 END IF; /*  value_set_type = 'D' */
768 			END IF; /* cRec.flex_field_type = 'D' */
769 		END IF; /* cRec.dimension_short_name LIKE 'EDW_GL_ACCT%_M'  */
770 		nCount := nCount + 1;
771 		FETCH c INTO cRec;
772 	END LOOP;
773 	CLOSE c;
774 
775     sDecodeClause := sDecodePrefix ||sDecodeClause||', ''NA_EDW'')';
776 
777 	IF (g_log) THEN
778 		edw_gen_view.writelog('decode clause is : '||sDecodeClause);
779 	END IF;
780 
781 	IF (cRec.flex_field_type = 'D') THEN
782         l_structure_col := edw_gen_view.getContextColForFlex(cRec.id_flex_code, 'D');
783 	IF (g_log) THEN
784 	        edw_gen_view.writelog('Descr. flexfield structure column is : '||l_structure_col);
785 	END IF;
786 	l_structure_col:= replace(l_structure_col, '''', '''''') ;
787 	IF (g_log) THEN
788 		edw_gen_view.writelog('structure is : '||l_structure_col);
789 	END IF;
790 
791 		IF ( upper(cRec.structure_name)='GLOBAL DATA ELEMENTS' OR l_structure_col IS NULL) THEN
792            IF (dependantVSExists ) THEN
793             sDecodeClause :='DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
794         	   		||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
795 		          	'"'||l_parent_seg_name||'"'||'||'':''||"'||l_gen_seg_name||'"'||')';
796            ELSE
797 			sDecodeClause := 'DECODE("'||l_gen_seg_name||'", null, ''NA_EDW'', '||
798 			''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
799 			'"'||l_gen_seg_name||'")';
800            END IF;
801         END IF;
802     ELSE  /* Key Flex */
803         l_structure_col := edw_gen_view.getContextColForFlex(cRec.id_flex_code, 'K');
804 	IF (g_log) THEN
805         edw_gen_view.writelog('Key flexfield structure column is : '||l_structure_col);
806 	END IF;
807 
808         IF (l_structure_col IS NULL) THEN
809             IF (dependantVSExists ) THEN
810                sDecodeClause := 'DECODE("'||l_gen_seg_name||'",null, ''NA_EDW'','
811         	   		||''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
812 		          	'"'||l_parent_seg_name||'"'||'||'':''||"'||l_gen_seg_name||'"'||')';
813            ELSE
814                sDecodeClause := 'DECODE("'||l_gen_seg_name||'", null, ''NA_EDW'', '||
815 			''''||cRec.instance_code||''''||'||'||''':'||cRec.value_set_id||':'''||'||'||
816 			'"'||l_gen_seg_name||'")';
817           END IF;
818         END IF;
819 	END IF;
820 
821 	/* DBMS_SQL.CLOSE_CURSOR(cid); */
822 
823 	IF (g_log) THEN
824 		edw_gen_view.writelog('Completed getdecodeclauseforflexfk, returning '||sDecodeClause||newline||newline);
825 		edw_gen_view.indentEnd;
826 
827 	END IF;
828 
829 	RETURN sDecodeClause;
830 
831 END;
832 
833 
834 
835 
836 END EDW_FACT_SV;