改存储过程是每月执行一次,删除两个月之前的数据;之前一直好好的,可是处理12月数据的时候(会删除10月数据)却老提示索引失效。
create or replace procedure pro_truncate_test
(p_month number default 0)
-------------------------------------------------------------------------------------------------------------------------------------------
----参数: p_month 删除月份偏移,例如取值为1表示删除当前月前一个月的分区数据
-------------------------------------------------------------------------------------------------------------------------------------------
is
v_name varchar2(4);
v_sql varchar2(4000);
begin
-------------------------------------------------------------------------------------------------------------------------------------------
if p_month<=0 or p_month>12 then
return;
end if;
SELECT
            case
            when
            to_number(to_char(sysdate,'mm'))<=p_month
            then
            to_number(to_char(sysdate,'mm'))+12-p_month
            else
            to_number(to_char(sysdate,'mm'))-p_month
            end
into v_name from dual;
v_sql:='alter table test truncate partition '||'p'||v_name||' update global indexes';
execute immediate v_sql;exception
when others THEN
COMMIT;
end;

解决方案 »

  1.   

    例如:你在执行这个存储过程的时候,当执行到重建索引的时候,如果网络异常,或会话被管理员kill了,
          此时,你的索引也就失效啦!
         建议:最好将分区表相关的索引建成“本地分区索引”!
      

  2.   

    原因:通过直接加载或DDL语句试图访问一个已经被标志为不可用状态的索引。
    处理:可以在你执行alter操作之前,rebuild一下这个索引。
      

  3.   


    可是为什么之前都可以呢?
    我的java程序会执行如下sql语句:
    alter table tb truncate partition p10;
    alter index z_index rebuild;
      

  4.   


    我oracle很菜
    请问,我原来这个有问题没?
    之前一直好好的
      

  5.   

    表空间不足引起的话,被报表空间不足的错误。
    unable to extend intablespace