关于oracle clob 类型字段重建索引SQL及修复用户表空间索引空间的存储过程

clob SQL:

ALTER TABLE SYSREPORT MOVE  TABLESPACE jft_index
LOB (CONTENT) STORE AS
(TABLESPACE jft_index);

CONTENT是clob字段
存储过程

  /*******************************
  *
  *修改集付通数据库默认表空间,临时表空间,索引表空间存储过程
  *
  *调用 : change_jft_tablespace(数据表空间名称,索引表空间名称) examp:exec change_jft_tablespace ('jft_data','jft_index');
  *auther: [email protected]
  *date : 2013-04-10 17:29:12
  *******************************/
  create or replace procedure change_jft_tablespace(data_table_space_name  in varchar,
                                                    index_table_space_name in varchar) is

  i_count INT := 0;

  --data_table_space_name varchar2(20):='';
  --index_table_space_name varchar2(20):='';
  --temp_table_space_name varchar2(20):='';

  --修改表的数据表空间 记录集放到游标中
  
  CURSOR c_data_sql IS
    SELECT 'alter table  ' || table_name || ' move tablespace ' ||
           data_table_space_name as ddl,
           table_name as tbname
      FROM user_tables
     where TABLESPACE_NAME <> upper(data_table_space_name);

  --修改表的索引表空间 记录集放到游标中
  
  CURSOR c_index_sql IS
    SELECT 'alter index ' || index_name || ' rebuild tablespace ' ||
           index_table_space_name as ddl,
           table_name as tbname
      FROM user_indexes
     where TABLESPACE_NAME <> upper(index_table_space_name)
       and index_type <> 'LOB';

begin

  --create temporary tablespace jft_temp tempfile 'F:\orac11g\demo\temp\jft_temp01.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local;
  --create tablespace jft_data logging datafile 'F:\orac11g\demo\data\jft_data01.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local;
  --create tablespace jft_index logging datafile 'F:\orac11g\demo\index\jft_index01.dbf' size 32m autoextend on next 32m maxsize 2048m extent management local;

  --alter user jft_test temporary tablespace jft_temp;
  --alter user jft_test default tablespace jft_data;


  --对于含有特殊类型clob字段的表需要特殊处理
   

 
  -- 执行修改索引表空间
  
  FOR r_mysql IN c_index_sql LOOP
    DBMS_OUTPUT.put_line(r_mysql.ddl || ',' || r_mysql.tbname);
    EXECUTE IMMEDIATE r_mysql.ddl;
    i_count := i_count + 1;
  END LOOP;
  DBMS_OUTPUT.put_line('i_count: ' || i_count);

  i_count := 0;
  -- 执行修改数据表空间
  
  FOR r_mysql IN c_data_sql LOOP
    DBMS_OUTPUT.put_line(r_mysql.ddl || ',' || r_mysql.tbname);
    EXECUTE IMMEDIATE r_mysql.ddl;
    i_count := i_count + 1;
  END LOOP;
  DBMS_OUTPUT.put_line('i_count: ' || i_count);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.put_line('异常:' || 'sqlcode:' || SQLCODE || ' sqlerrm : ' ||
                         SQLERRM);
  
end change_jft_tablespace;
/


今天发现插入数据索引失效的问题
后来发现上述却本造成索引无索了
解决办法:先修改表的表空间,再修改再的表的索引表空间
  请将上述两段代码互换

你可能感兴趣的:(oracle)