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

出处:Examlink 作者: 日期:2008年03月20日 15时17分
对系统默认的约束名和索引名进行重命名的存储过程示例:

  create or replace procedure proc_rename_constraint
  as
  --查找用户所有表的游标
  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_table
  and substr(c.constraint_name,2,2) <> 'K_';

  --查找某个约束所有字段的游标
  cursor cur_columns(c_cons varchar2) is select
  column_name from user_cons_columns
  where 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) loop
  v_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' then
  v_new_cons_name := 'PK_' || v_new_cons_name;
  elsif cur_lcons.constraint_type='R' then
  v_new_cons_name := 'FK_' || v_new_cons_name;
  elsif cur_lcons.constraint_type='U' then
  v_new_cons_name := 'UK_' || v_new_cons_name;
  elsif cur_lcons.constraint_type='C'
  and instr(cur_lcons.search_condition,'IS NOT NULL') > 0 then
  v_new_cons_name := 'CK_' || v_new_cons_name || 'NOTNULL' ;
  elsif cur_lcons.constraint_type='C'
  and instr(cur_lcons.search_condition,'IS NOT NULL') = 0
  and cur_lcons.search_condition is not null then
  v_new_cons_name := 'CK_' || v_new_cons_name;
  end if;

  --约束名如果超过30个字符的处理
  if length(v_new_cons_name) > 29 then
  v_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 then
  v_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' then
  select count(*) into n_con from user_indexes where
  index_name=cur_lcons.constraint_name;
  if n_con = 1 then
  v_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;

最后更新时间:2008-05-28 12:34:16
文章评论
共有 0 位网友发表了评论
用户名: 新注册) 密码: 匿名评论 [查看所有评论]

评论内容:(不能超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规。
您可以用以下几种方式找到此文章

考试全流程