对系统默认的约束名和索引名进行重命名

浏览:8日期:2023-08-05

对系统默认的约束名和索引名进行重命名的存储过程示例:

create or replace procedure proc_rename_constraintas--查找用户所有表的游标cursor cur_table is select table_name from user_tables;

--查找某张表所有约束的游标cursor cur_cons (c_table varchar2) is select c.constraint_name,c.constraint_type,c.search_condition from user_constraints c where c.table_name=c_tableand substr(c.constraint_name,2,2) <> 'K_';

--查找某个约束所有字段的游标cursor cur_columns(c_cons varchar2) is select column_name from user_cons_columnswhere constraint_name=c_cons;

--存储修改后的约束名v_new_cons_name varchar2(100);

--存储修改约束名的SQL语句v_sql varchar2(150);

--存储重名的个数cnt number :=1;

--存储新索引名的个数n_idx number;

--存储新约束名的个数n_con number;

begin--循环取表名for cur_ltable in cur_table loop

--循环取约束名for cur_lcons in cur_cons(cur_ltable.table_name) loop

v_new_cons_name :=null;

--循环取字段名for cur_lcolumns in cur_columns(cur_lcons.constraint_name) loopv_new_cons_name := v_new_cons_name || cur_lcolumns.column_name;end loop;v_new_cons_name := replace(v_new_cons_name,'_','');v_new_cons_name := cur_ltable.table_name ||'_' || v_new_cons_name;

if cur_lcons.constraint_type='P' thenv_new_cons_name := 'PK_' || v_new_cons_name;elsif cur_lcons.constraint_type='R' thenv_new_cons_name := 'FK_' || v_new_cons_name;elsif cur_lcons.constraint_type='U' thenv_new_cons_name := 'UK_' || v_new_cons_name;elsif cur_lcons.constraint_type='C'and instr(cur_lcons.search_condition,'IS NOT NULL') > 0 thenv_new_cons_name := 'CK_' || v_new_cons_name || 'NOTNULL' ;elsif cur_lcons.constraint_type='C'and instr(cur_lcons.search_condition,'IS NOT NULL') = 0and cur_lcons.search_condition is not null thenv_new_cons_name := 'CK_' || v_new_cons_name;end if;

--约束名如果超过30个字符的处理if length(v_new_cons_name) > 29 thenv_new_cons_name := substr(v_new_cons_name,1,15) || substr(v_new_cons_name,-14);end if;

--查找系统里是否有新的约束名select count(*) into n_con from user_constraints where constraint_name=v_new_cons_name;select count(*) into n_idx from user_indexes where index_name=v_new_cons_name;if n_con > 0 or n_idx > 0 thenv_new_cons_name := v_new_cons_name || to_char(cnt);cnt := cnt +1;end if;

--对由主键和唯一键创建的索引进行改名,改后的名字为新的约束名if cur_lcons.constraint_type='P' or cur_lcons.constraint_type='U' thenselect count(*) into n_con from user_indexes where index_name=cur_lcons.constraint_name;if n_con = 1 thenv_sql := 'alter index ' || cur_lcons.constraint_name || ' rename to ' || v_new_cons_name;execute immediate v_sql;end if;end if;

--对约束改名v_sql := 'alter table ' || cur_ltable.table_name || ' rename constraint ';v_sql := v_sql || cur_lcons.constraint_name || ' to ' || v_new_cons_name;execute immediate v_sql;

end loop;

end loop;

end;

相关文章: