[Home] [Help]
PACKAGE BODY: APPS.FND_XDF_UTIL_PKG
Source
1 package body fnd_xdf_util_pkg as
2 /* $Header: fndpxutb.pls 120.4.12010000.2 2009/10/10 02:04:19 smadhapp ship $ */
3
4 /* The function receives the list of columns as the argument and returns an
5 * array of numbers containing hash values corresopnding to each of the
6 * columns.
7 */
8 function get_hashcode_table( p_tablename in varchar2 ,
9 p_owner in varchar2,
10 p_columns_list out NOCOPY FND_XDF_TABLE_OF_VARCHAR2_30,
11 table_hash_val out NOCOPY number )
12 return FND_XDF_TABLE_OF_NUMBER is
13 l_hashVal number;
14 l_hashCode_List FND_XDF_TABLE_OF_NUMBER := FND_XDF_TABLE_OF_NUMBER();
15 l_column_List FND_XDF_TABLE_OF_VARCHAR2_30 := FND_XDF_TABLE_OF_VARCHAR2_30();
16 ind integer;
17 tmp_str varchar2(32000);
18
19 begin
20 tmp_str := '';
21 ind := 0;
22 SELECT DURATION || NVL(TEMPORARY,'N') || NVL(PCT_FREE, 0)
23 || NVL(PCT_USED, 0) || NVL(INI_TRANS, 0) ||
24 NVL(MAX_TRANS, 0) || NVL(INITIAL_EXTENT, 0) ||
25 NVL(NEXT_EXTENT, 0) || NVL(MIN_EXTENTS, 0) ||
26 NVL(MAX_EXTENTS, 0) || NVL(PCT_INCREASE, 0) ||
27 NVL(PARTITIONED, 'NO') || NVL(FREELISTS, 0) ||
28 NVL(FREELIST_GROUPS, 0) ||
29 NVL(DECODE(LTRIM(DEGREE), 'DEFAULT', 65536, DEGREE) , 0) ||
30 LOGGING|| CACHE|| IOT_TYPE || ROW_MOVEMENT into tmp_str
31 FROM ALL_TABLES WHERE TABLE_NAME=p_tablename AND OWNER=p_owner;
32
33 for x in ( select COLUMN_NAME, DATA_TYPE, DATA_LENGTH, NULLABLE,
34 DATA_PRECISION, DATA_SCALE, DATA_DEFAULT from all_tab_columns where
35 table_name =p_tablename and owner = p_owner order by column_name)
36 loop
37
38 l_hashVal := dbms_utility.get_hash_value(x.COLUMN_NAME || x.DATA_TYPE || x.DATA_LENGTH || x.NULLABLE || x.DATA_PRECISION || x.DATA_SCALE || x.DATA_DEFAULT, 1, 999999999);
39 ind := ind + 1;
40 l_hashCode_List.EXTEND;
41 l_hashCode_List(ind) := l_hashVal;
42
43 l_column_List.EXTEND;
44 l_column_List(ind) := x.COLUMN_NAME;
45 tmp_str := tmp_str || l_hashVal;
46 end loop;
47
48 for x in ( SELECT PARTITION_NAME, HIGH_VALUE, SUBPARTITION_COUNT
49 FROM DBA_TAB_PARTITIONS
50 WHERE TABLE_NAME = p_tablename
51 and TABLE_OWNER = p_owner ORDER BY PARTITION_POSITION)
52 loop
53
54 l_hashVal := dbms_utility.get_hash_value(x.PARTITION_NAME || x.HIGH_VALUE || x.SUBPARTITION_COUNT,1,999999999);
55 tmp_str := tmp_str || l_hashVal;
56 end loop;
57
58 for x in ( SELECT COLUMN_NAME FROM DBA_PART_KEY_COLUMNS
59 WHERE NAME = p_tablename AND OWNER =p_owner ORDER BY COLUMN_POSITION)
60 loop
61 l_hashVal := dbms_utility.get_hash_value(x.COLUMN_NAME,1,999999999);
62 tmp_str := tmp_str || l_hashVal;
63 end loop;
64
65 table_hash_val := dbms_utility.get_hash_value(tmp_str , 1, 999999999);
66 p_columns_list := l_column_List;
67 return l_hashCode_List;
68 exception
69 WHEN NO_DATA_FOUND THEN
70 table_hash_val := 0;
71 return l_hashCode_List;
72 end;
73
74
75 function get_hashcode_qtable( p_qtablename in varchar2, p_owner in varchar2)
76 return number is
77 l_hashstr varchar2(32000);
78 begin
79 SELECT TYPE || OBJECT_TYPE || SORT_ORDER || RECIPIENTS ||
80 MESSAGE_GROUPING || PRIMARY_INSTANCE || SECONDARY_INSTANCE ||
81 USER_COMMENT INTO l_hashstr
82 FROM ALL_QUEUE_TABLES
83 WHERE QUEUE_TABLE=p_qtablename AND OWNER= p_owner;
84 return DBMS_UTILITY.GET_HASH_VALUE(l_hashstr,1,999999999);
85 exception
86 WHEN NO_DATA_FOUND THEN
87 return 0;
88 end;
89
90
91
92 function get_hashcode_queue(p_queuename in varchar2, p_owner in varchar2)
93 return number is
94 l_hashstr varchar2(32000);
95 begin
96 SELECT name || queue_table || max_retries || enqueue_enabled ||
97 dequeue_enabled || retry_delay || retention || user_comment
98 INTO l_hashstr
99 FROM ALL_QUEUES
100 WHERE OWNER=p_owner AND NAME = p_queuename;
101 return DBMS_UTILITY.GET_HASH_VALUE(l_hashstr,1,999999999);
102 exception
103 WHEN NO_DATA_FOUND THEN
104 return 0;
105 end;
106
107 /*
108 * Funtion to generate the hashcode for an index
109 */
110 function get_hashcode_index(p_indexname in varchar2, p_owner in varchar2)
111 return number is
112 l_hashstr varchar2(32000);
113 cursor col_cur is
114 SELECT COLUMN_NAME
115 FROM all_ind_columns
116 WHERE INDEX_NAME = p_indexname AND INDEX_OWNER = p_owner
117 ORDER BY COLUMN_POSITION;
118 begin
119 SELECT INDEX_TYPE || UNIQUENESS || NVL(INI_TRANS, 0) || NVL(MAX_TRANS, 0) ||
120 NVL(INITIAL_EXTENT, 0) || NVL(NEXT_EXTENT, 0 ) || NVL(MIN_EXTENTS, 0) || NVL(MAX_EXTENTS, 0) ||
121 NVL(PCT_INCREASE, 0) || NVL(FREELISTS, 0) || NVL(FREELIST_GROUPS, 0) || NVL(pct_free, 0) ||
122 NVL(DECODE(LTRIM(DEGREE), 'DEFAULT', 65536, DEGREE),0) || NVL(PARTITIONED, 'NO') ||
123 NVL(funcidx_status, 'DISABLED') || TABLE_NAME ||
124 TABLE_TYPE || NVL(ITYP_OWNER, '-1') || NVL(ITYP_NAME,'-1') || NVL(PARAMETERS, '-1') || NVL(COMPRESSION, 'DISABLED')
125 INTO l_hashstr
126 FROM ALL_INDEXES
127 WHERE index_name = p_indexname AND OWNER = p_owner;
128
129 for c in col_cur loop
130 l_hashstr := l_hashstr || c.column_name;
131 end loop;
132 return DBMS_UTILITY.GET_HASH_VALUE(l_hashstr,1,999999999);
133 exception
134 WHEN NO_DATA_FOUND THEN
135 return 0;
136 end;
137
138 /*
139 * Function that generates the hashcode for an array of indexes.
140 */
141 /*
142 function get_hashcode_index(p_indexList in FND_XDF_TABLE_OF_VARCHAR2_30, p_owner in varchar2)
143 return FND_XDF_TABLE_OF_NUMBER is
144 indexHashcodes FND_XDF_TABLE_OF_NUMBER := FND_XDF_TABLE_OF_NUMBER();
145
146 TYPE typIndxDetails IS REF CURSOR;
147 selQry varchar2(32000);
148 indxDet typIndxDetails;
149
150 cursor col_cur (p_indexname varchar2) is
151 SELECT COLUMN_NAME
152 FROM all_ind_columns
153 WHERE INDEX_NAME = p_indexname AND INDEX_OWNER = p_owner
154 ORDER BY COLUMN_POSITION;
155
156 columnNameIndx varchar2(4000);
157
158 l_hashstr varchar2(32000);
159 index_name varchar2(32000);
160 i number := 1;
161 l_indexListStr varchar2(32000);
162
163 begin
164 -- Generate the index names string from the table of index names.
165 for j in 1..p_indexList.count loop
166 l_indexListStr := l_indexListStr || '''' || p_indexList(j) || ''',';
167 end loop;
168 l_indexListStr := SUBSTR(l_indexListStr,1,LENGTH(l_indexListStr) - 1);
169 --DBMS_OUTPUT.PUT_LINE(l_indexListStr);
170
171 selQry := 'SELECT INDEX_TYPE || UNIQUENESS || NVL(INI_TRANS, 0) || NVL(MAX_TRANS, 0) || '
172 ||'NVL(INITIAL_EXTENT, 0) || NVL(NEXT_EXTENT, 0 ) || NVL(MIN_EXTENTS, 0) || NVL(MAX_EXTENTS, 0) || '
173 ||'NVL(PCT_INCREASE, 0) || NVL(FREELISTS, 0) || NVL(FREELIST_GROUPS, 0) || NVL(pct_free, 0) || '
174 ||'NVL(DECODE(LTRIM(DEGREE), ''DEFAULT'', 65536, DEGREE),0) || NVL(PARTITIONED, ''NO'') || '
175 ||'NVL(funcidx_status, ''DISABLED'') || TABLE_NAME || NVL(tablespace_name, '' '') || TABLE_OWNER || '
176 ||'TABLE_TYPE || NVL(ITYP_OWNER, ''-1'') || NVL(ITYP_NAME,''-1'') || NVL(PARAMETERS, ''-1'') || NVL(COMPRESSION, ''DISABLED'') hashstr,'
177 ||'index_name '
178 ||'FROM ALL_INDEXES , TABLE(FND_XDF_TABLE_OF_VARCHAR2_30(' || l_indexListstr ||')) FND_TAB '
179 ||'WHERE index_name = FND_TAB.COLUMN_VALUE AND OWNER = ''' || p_owner || ''''
180 ||' UNION ALL '
181 ||'SELECT ''NULL'', C.COLUMN_VALUE FROM TABLE(FND_XDF_TABLE_OF_VARCHAR2_30('|| l_indexListstr || ')) C '
182 ||'WHERE C.COLUMN_VALUE NOT IN '
183 ||'(SELECT B.INDEX_NAME FROM ALL_INDEXES B WHERE OWNER = '''|| p_owner || ''' AND C.COLUMN_VALUE = B.INDEX_NAME) ';
184
185 --DBMS_OUTPUT.PUT_LINE(l_indexListStr);
186 --DBMS_OUTPUT.PUT_LINE(selQry);
187
188 open indxDet for selQry;
189 loop
190 fetch indxDet into l_hashstr,index_name;
191 exit when indxDet%NOTFOUND;
192
193 --DBMS_OUTPUT.PUT_LINE(i);
194 --DBMS_OUTPUT.PUT_LINE(l_hashstr);
195
196 open col_cur(index_name);
197 loop
198 fetch col_cur into columnNameIndx;
199 exit when col_cur%NOTFOUND;
200 exit when l_hashstr = 'NULL';
201 l_hashstr := l_hashstr || columnNameIndx;
202 end loop;
203 close col_cur;
204
205 --DBMS_OUTPUT.PUT_LINE(l_hashstr);
206
207 indexHashcodes.EXTEND;
208 if l_hashstr <>'NULL' then
209 indexHashcodes(i) := DBMS_UTILITY.GET_HASH_VALUE(l_hashstr,1,999999999);
210 else
211 indexHashcodes(i) := 0;
212 end if;
213 i := i+1;
214 end loop;
215 close indxDet;
216 return indexHashcodes;
217 end;
218 */
219
220 /*
221 * Function that generates the hashcode for an array of indexes.
222 */
223 function get_hashcode_index(p_indexList in FND_XDF_TABLE_OF_VARCHAR2_30, p_owner in varchar2)
224 return FND_XDF_TABLE_OF_NUMBER is
225 indexHashcodes FND_XDF_TABLE_OF_NUMBER := FND_XDF_TABLE_OF_NUMBER();
226 selQry varchar2(32000);
227 cursor col_cur (p_indexname varchar2) is
228 SELECT COLUMN_NAME
229 FROM all_ind_columns
230 WHERE INDEX_NAME = p_indexname AND INDEX_OWNER = p_owner
231 ORDER BY COLUMN_POSITION;
232 columnNameIndx varchar2(4000);
233 l_hashstr varchar2(32000);
234 i number := 1;
235 begin
236
237 selQry := 'SELECT INDEX_TYPE || UNIQUENESS || NVL(INI_TRANS, 0) || NVL(MAX_TRANS, 0) || '
238 ||'NVL(INITIAL_EXTENT, 0) || NVL(NEXT_EXTENT, 0 ) || NVL(MIN_EXTENTS, 0) || NVL(MAX_EXTENTS, 0) ||'
239 ||'NVL(PCT_INCREASE, 0) || NVL(FREELISTS, 0) || NVL(FREELIST_GROUPS, 0) || NVL(pct_free, 0) ||'
240 ||'NVL(DECODE(LTRIM(DEGREE), ''DEFAULT'', 65536, DEGREE),0) || NVL(PARTITIONED, ''NO'') ||'
241 ||'NVL(funcidx_status, ''DISABLED'') || TABLE_NAME || '
242 ||'TABLE_TYPE || NVL(ITYP_OWNER, ''-1'') || NVL(ITYP_NAME,''-1'') || NVL(PARAMETERS, ''-1'') || NVL(COMPRESSION, ''DISABLED'') hashstr'
243 ||' FROM ALL_INDEXES '
244 ||' WHERE OWNER = '''|| p_owner ||''' AND INDEX_NAME = :p_indexname ';
245
246 for j in 1..p_indexList.count loop
247 begin
248 execute immediate selQry into l_hashstr using p_indexList(j);
249 exception
250 when NO_DATA_FOUND then
251 l_hashstr := 'NULL';
252 end;
253
254 -- DBMS_OUTPUT.PUT_LINE(l_hashstr);
255
256
257 open col_cur(p_indexList(j));
258 loop
259 fetch col_cur into columnNameIndx;
260 exit when col_cur%NOTFOUND;
261 exit when l_hashstr = 'NULL';
262 l_hashstr := l_hashstr || columnNameIndx;
263 end loop;
264 close col_cur;
265
266
267 indexHashcodes.EXTEND;
268 if l_hashstr <>'NULL' then
269 indexHashcodes(i) := DBMS_UTILITY.GET_HASH_VALUE(l_hashstr,1,999999999);
270 else
271 indexHashcodes(i) := 0;
272 end if;
273 i := i+1;
274 end loop;
275 return indexHashcodes;
276 end;
277
278 /* Function to determine the referenced objects of type
279 'TABLE','TYPE','MATERIALIZED VIEW','VIEW','INDEX'
280 Input Parameters : 1. Object Name
281 2. Object Type
282 3. Owner of the Object
283
284 */
285 function depends( p_name in varchar2,
286 p_type in varchar2,
287 p_owner in varchar2,
288 p_lvl in number default 1 ) return fnd_xdf_deptype_tab_info
289 as
290 l_data fnd_xdf_deptype_tab_info := fnd_xdf_deptype_tab_info();
291
292 procedure recurse( p_name in varchar2,
293 p_type in varchar2,
294 p_owner in varchar2,
295 p_lvl in number )
296 is
297 begin
298 if ( l_data.count > 1000 )
299 then
300 raise_application_error( -20001, 'probable connect by loop, aborting' );
301 end if;
302
303 for x in ( select /*+ first_rows */ name,
304 owner,
305 type
306 from dba_dependencies
307 where referenced_owner = p_owner
308 and referenced_type = p_type
309 and type in ('TABLE','TYPE','MATERIALIZED VIEW','VIEW','INDEX')
310 and referenced_name = p_name )
311 loop
312 l_data.extend;
313 l_data(l_data.count) :=
314 fnd_xdf_deptype_info( p_lvl, x.name,
315 x.owner, x.type );
316 recurse( x.name, x.type,
317 x.owner, p_lvl+1);
318 end loop;
319 end;
320 begin
321 l_data.extend;
322 l_data(l_data.count) := fnd_xdf_deptype_info( 1, p_name, p_owner, p_type );
323 recurse( p_name, p_type, p_owner, 2 );
324 return l_data;
325 end;
326
327 end fnd_xdf_util_pkg;