oracle批量添加指定表前缀的索引SQL语句

陌路散爱 提交于 2020-08-14 05:44:56

oracle批量添加指定表前缀的索引SQL语句

需要输入用户名,表空间,索引个数,表名前缀,过滤的表名后缀

 

##需要输入用户名,表空间,索引个数,表名前缀,过滤的表名后缀
declare
  --用户名
  userName varchar2(50) :='apps';
  --表空间
  tablespaceName varchar2(50) :='APPS_TS_TX_IDX';
  --索引个数
  rowN number :=3;
  --过滤表名后缀,该表不添加索引,例如临时表
  tableLastName varchar2(10) :=upper('_temp');
  tableLastName1 varchar2(10) :=upper('_te');
  --表名前缀
  cursor vdata is select t.table_name from user_tables t where t.TABLE_NAME like upper('SRM_POS_%') 
  and t.TABLE_NAME not like '%'||tableLastName 
  and t.TABLE_NAME not like '%'||tableLastName1
  order by t.TABLE_NAME;
  --声明变量,记录一行数
  v vdata%rowtype;
  n number;
  --索引名,限制最大程度为30字符
  indexName varchar2(30);
  temp varchar2(27);
  k number;
begin
     --打开游标
   open vdata;
   --循环遍历取数据
   loop
     fetch vdata into v;
     exit when vdata%NOTFOUND;
     select count(*) into n from user_ind_columns t where t.TABLE_NAME=upper(v.table_name);
     if n<rowN then
       k := 1;
       --dbms_output.put_line('表名:-----'||v.table_name);
       select length(v.table_name) into n from dual;
       if n>27 then
          temp := substr(v.table_name,0,27);
       else
          temp := v.table_name;
       end if;
       indexName := temp||'_N'||k;
       for cur in (select t.column_name,t.TABLE_NAME from user_tab_columns t where  t.table_name = upper(v.table_name) ---表名 
          and instr(lower(t.column_name), 'attribute') = 0
          and instr(lower(t.COLUMN_NAME),'last_update') = 0
          and instr(lower(t.COLUMN_NAME),'version_num') = 0
          and instr(lower(t.COLUMN_NAME),'created_by') = 0
          and instr(lower(t.COLUMN_NAME),'creation_date') = 0 
          and t.COLUMN_ID<=rowN) loop
          --判断该字段是否已经创建索引
          select count(*) into n from user_ind_columns t where t.TABLE_NAME=upper(v.table_name) and t.COLUMN_NAME=upper(cur.column_name);
          --未创建索引
          if n<1 then
            --判断索引名是否存在
            select count(*) into n from user_ind_columns t where t.INDEX_NAME=upper(indexName);
            while n>0 loop
              k := k+1;
              indexName := temp||'_N'||k;
              select count(*) into n from user_ind_columns t where t.INDEX_NAME=upper(indexName);
            end loop;
            --打印创建索引语句
            dbms_output.put_line('Create Index '||userName||'.'||indexName||' ON '||userName||'.'||cur.table_name||'('||cur.column_name||')'||' tablespace '||tablespaceName||';');
            k := k+1;
            indexName := temp||'_N'||k;
          end if;
        end loop;
     end if;
   end loop;  
   --关闭游标
   close vdata;   
end;

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!