由于针对大表执行shrink非常慢,不适合一直在客户端等着,后来研究了一下,可以写个job来执行,感觉还比较好。
1、首先创建一个存储过程pro_job_j_test01
-
create or replace procedure pro_job_j_test01 is
-
str_sql1 varchar2(64):= 'alter table tab01 enable row movement';
-
str_sql2 varchar2(64):= 'alter table tab01 shrink space';
-
begin
-
--insert into j_test01 values(sysdate);
-
execute immediate str_sql1;
-
execute immediate str_sql2;
-
end pro_job_j_test01;
2、创建job
-
declare job01 number;
-
begin
-
dbms_job.submit(job01,'pro_job_j_test01;',sysdate);----what后面有个分号,很关键。
-
commit;
-
end;
这样的job是立即执行的,由于未设置interval参数,这个job就只执行一次。
另外,关于job的详细介绍,可以参考http://blog.csdn.net/dogwoods/article/details/2010571,这里说的非常清楚了。
常用的也就是查询job:
select * from user_jobs;--上面那种只执行一次的job,执行完,查询的时候已经都不存在了。
可以通过job编号删除job:
begin
dbms_job.remove(23);
end;
阅读(1630) | 评论(0) | 转发(0) |