sql for loop

--step1 disable constraint
begin
for i in (select uc.constraint_name, uc.table_name from user_constraints uc, all_tables tab where uc.OWNER='xx' and tab.OWNER='xx' and uc.table_name=tab.table_name) 
LOOP
 begin
 execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
 exception
        when others then
        dbms_output.put_line(i.table_name);
        dbms_output.put_line(i.constraint_name);
 end;
end loop;
end; 
/


--step2: drop index
BEGIN
  FOR ind IN 
    (SELECT ui.index_name FROM user_indexes ui, all_tables tab WHERE ui.TABLE_OWNER='xx' and tab.OWNER='xx' and ui.table_name=tab.table_name and INDEX_TYPE != 'LOB')
 LOOP
 BEGIN
      execute immediate 'DROP INDEX '||ind.index_name;
      exception
        when others then
        dbms_output.put_line(ind.index_name);
  END;      
  END LOOP;
END;
/
COMMIT;

--step3 update all coulmn
undefine schema_name;
declare 
  l_Err varchar2(200);
begin
  for r in (select  atc.table_name, atc.column_name, atc.data_length
            from    all_tab_columns  atc, all_tables tab WHERE atc.owner=tab.OWNER  and atc.table_name=tab.table_name
            and   atc.data_type   = 'VARCHAR2'
            and     atc.char_used   = 'B' --Indicates that the column uses BYTE length semantics (B) or CHAR length semantics (C)
--            and     atc.table_name  = 'INACTIVE_ACCOUNT' --TEST
            and     atc.owner       = upper('&&schema_name')) 
  loop
    begin
      execute immediate 'alter table '|| upper('&&schema_name')
                                      || '.'
                                      || r.table_name
                                      || ' modify '
                                      || r.column_name
                                      || ' varchar2('
                                      || r.data_length
                                      || ' char)'; 
    end; 
    commit; 
  end loop; 
end;
/
COMMIT;

--step4 create index
please refer in last part


--step5 create index - run two times
begin
for i in (select uc.constraint_name, uc.table_name from user_constraints uc, all_tables tab where uc.OWNER='xx' and tab.OWNER='xx' and uc.table_name=tab.table_name) 
LOOP
 begin
execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';
  exception
        when others then
        dbms_output.put_line(i.constraint_name);
 end;
end loop;
end; 
/
COMMIT;
begin
for i in (select uc.constraint_name, uc.table_name from user_constraints uc, all_tables tab where uc.OWNER='xx' and tab.OWNER='xx' and uc.table_name=tab.table_name) 
LOOP
 begin
execute immediate 'alter table '||i.table_name||' enable constraint '||i.constraint_name||'';
  exception
        when others then
        dbms_output.put_line(i.constraint_name);
 end;
end loop;
end; 
/
COMMIT;

 

posted @ 2019-12-03 16:19  kakaisgood  阅读(740)  评论(0编辑  收藏  举报