改存储过程是每月执行一次,删除两个月之前的数据;之前一直好好的,可是处理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;
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;
此时,你的索引也就失效啦!
建议:最好将分区表相关的索引建成“本地分区索引”!
处理:可以在你执行alter操作之前,rebuild一下这个索引。
可是为什么之前都可以呢?
我的java程序会执行如下sql语句:
alter table tb truncate partition p10;
alter index z_index rebuild;
我oracle很菜
请问,我原来这个有问题没?
之前一直好好的
unable to extend intablespace