Friday, October 1, 2010

How to Create Index on Foreign Keys (Script)

Script contacins two sections
1) Function that would combine multiple rows into single string
2) Script used to create "Create Index" statement.

CREATE OR REPLACE FUNCTION xx_concate_FIELDs (sqlstr in varchar2, sep in varchar2 ) return varchar2 is
ret varchar2(4000) := '';
TYPE cur_typ IS REF CURSOR;
rec cur_typ;
field varchar2(4000);
begin
OPEN rec FOR sqlstr;
LOOP
FETCH rec INTO field;
EXIT WHEN rec%NOTFOUND;
ret := ret || field || sep;
END LOOP;
if length(ret) = 0 then
RETURN '';
else
RETURN substr(ret,1,length(ret)-length(sep));
end if;
end;
/


SELECT 'create index ' || t.owner || '.' || 'xx_' ||
substr(t.table_name, 1, 20) || xxhr.emp_tmp.nextval ||
' on ' || t.owner || '.' || t.table_name || '(' ||
t.concate_fields || ');' STRING
,t.owner
,t.table_name
FROM (SELECT DISTINCT uc.owner
,uc.constraint_name
,uc.constraint_type
,uc.table_name
,xx_concate_fields('select column_name from all_cons_columns where table_name = ''' ||
uc.table_name || '''' ||'AND constraint_name=''' || uc.constraint_name ||''' order by position ',',') concate_fields
FROM all_constraints uc
,all_cons_columns ucc
WHERE uc.constraint_type = 'R' AND
uc.constraint_name = ucc.constraint_name AND
uc.table_name = ucc.table_name) t;