Из найденого в черновиках. Данный скрипт применялся для докручивания БД, где внешнии ключи отсутствовали как класс
и связи между таблицами строились на основе наименования полей.
declare vSQL varchar2(2000); vi number; begin vi := 1; for c in ( select a.table_name, a.column_name, b.table_name pk_table from user_tab_columns a, user_constraints b, user_ind_columns c where (a.column_name like 'KD_%' or (a.column_name like 'ID_%' and a.column_name!='ID_USR')) and not exists (select 1 from user_constraints b1, user_ind_columns c1 where b1.table_name=a.table_name and b1.constraint_type='P' and c1.index_name=b1.index_name and c1.column_name=a.column_name) and b.constraint_type='P' and b.table_name!=a.table_name and b.index_name=c.index_name and c.column_name = a.column_name) loop begin vSQL:='create index '||c.table_name||'_i'||to_char(vi)||' on '||c.table_name||' ('||c.column_name||')'; execute immediate vSQL; vi:=vi+1; exception when others then null; end; begin vSQL:='alter table '||c.table_name||' add constraint '||c.table_name||'_fk'||to_char(vi)||' foreign key ('||c.column_name||') '|| 'references '||c.pk_table||' ('||c.column_name||')'; execute immediate vSQL; vi:=vi+1; exception when others then dbms_output.put_line(c.table_name||c.column_name); dbms_output.put_line(vSQL); end; end loop; end;