数据库里的数据日夜累计,如果不对数据库的过期冗余数据删除,会影响运行速度。
我最近尝试了一种方法来删除数据,那就是写一个存储过程删除满足条件的数据,然后建一个JOB来自动运行这个存储过程。
我最近尝试了一种方法来删除数据,那就是写一个存储过程删除满足条件的数据,然后建一个JOB来自动运行这个存储过程。
oracle在SQLPLUS 和PLSQL建 job 的区别:
在SQLPLUS 是这样写
//建立job
variable test_job_really number;
begin
dbms_job.submit(:test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440');
commit;
end;
/
--------------------------
如果是PLSQL的话
--declare
declare test_job_really number;
begin
dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440'); //test_job_really前面去掉:号
commit;
end;
/
在SQLPLUS 是这样写
//建立job
variable test_job_really number;
begin
dbms_job.submit(:test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440');
commit;
end;
/
--------------------------
如果是PLSQL的话
--declare
declare test_job_really number;
begin
dbms_job.submit(test_job_really,'test_jobproce;',sysdate,'sysdate+1/1440'); //test_job_really前面去掉:号
commit;
end;
/
get jobno
select job from dba_jobs where what = 'test_jobproce;'
select job from dba_jobs where what = 'test_jobproce;'
JOB一些常用的命令
---停止job 25是建立的job test_job_really
begin
dbms_job.broken(25,true);
commit;
end;
/
--启动job
begin
dbms_job.run(25);
commit;
end;
/
--删除job
begin
dbms_job.remove(25);
commit;
end;
/
--查看执行结果
select * from test_job order by test_job.para_date desc;
--查看job
select * from sys.user_jobs
--使用下面的SQL查询是否JOB还在Running,前提是需要job执行时间不能过短
select * from dba_jobs_running
begin
dbms_job.remove(25);
commit;
end;
/
--查看执行结果
select * from test_job order by test_job.para_date desc;
--查看job
select * from sys.user_jobs
--使用下面的SQL查询是否JOB还在Running,前提是需要job执行时间不能过短
select * from dba_jobs_running
除了submit参数外,其余的几个参数有:
dbms_job.run(v_job); //运行job
dbms_job.broken(v_job,true,next_date); //停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
dbms_job.remove(v_job); //删除某个job
dbms_job.what(v_job,'sp_fact_charge_code;'); //修改某个job名
dbms_job.next_date(v_job,sysdate); 修改下一次运行时间
dbms_job.run(v_job); //运行job
dbms_job.broken(v_job,true,next_date); //停止一个job,里面参数true也可是false,next_date(某一时刻停止)也可是sysdate(立刻停止)。
dbms_job.remove(v_job); //删除某个job
dbms_job.what(v_job,'sp_fact_charge_code;'); //修改某个job名
dbms_job.next_date(v_job,sysdate); 修改下一次运行时间
如果JOB不能自动运行,需要设置一些参数,参数如下:
利用Oracle的Job Queue实现定时操作
1、确保Oracle的工作模式允许启动队列管理器(SNP进程)
SVRMGRL> Alter System Enable Restricted Session;
或 SQL> Alter System Disenable Restricted Session;
2、确保Oracle已配置任务队列管理器的启动参数
initSID.ora中:
job_queue_process=n(0);(0-36)个进程
job_queue_interval=N(60);(1-3600)秒唤醒
initSID.ora中:
job_queue_process=n(0);(0-36)个进程
job_queue_interval=N(60);(1-3600)秒唤醒
3、将任务加入数据库的任务队列中
DBMS_JOB.Submit (
job out binary_integer, (任务号)
what in varchar2, (执行任务的名称及入参)
next_date in date, (任务执行的时间)
interval in varchar2, (任务执行的间隔。null:执行一次;sysdate+m:周期性,每隔m天执行)
no_parse in boolean)
DBMS_JOB.Submit (
job out binary_integer, (任务号)
what in varchar2, (执行任务的名称及入参)
next_date in date, (任务执行的时间)
interval in varchar2, (任务执行的间隔。null:执行一次;sysdate+m:周期性,每隔m天执行)
no_parse in boolean)
同时
grant execute on dbms_job to ...;
grant execute on dbms_job to ...;
4、将要执行的任务,为存储过程等PL/SQL程序段
SQL> variable n number;
SQL> begin
2 dbms_job.submit(n, my_job, sysdate, sysdate + 1/360);
3 commit;
4 end
5 /
SQL> print :n;
SQL> variable n number;
SQL> begin
2 dbms_job.submit(n, my_job, sysdate, sysdate + 1/360);
3 commit;
4 end
5 /
SQL> print :n;
5、查看Job
Table :user_jobs、dba_jobs
Column:job (任务号)
next_date (下次执行日期)
next_sec (下次执行时间)
failures (失败次数,失败16次则自动终止)
broken (终止标志,Y/N)
在数据库找到initsid.ini这个配置文件,进行这些选项的配置,
SQL> show parameters job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 0
数据库配置只有这项,值是0,说明没有设置
修改可执行作业个数为20个
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;
这样就可以自动运行JOBL 。
6、一些必要的参数
修改initsid.ora参数
job_queue_processes = 4
job_queue_interval = 10
job_queue_keep_connections=true
Table :user_jobs、dba_jobs
Column:job (任务号)
next_date (下次执行日期)
next_sec (下次执行时间)
failures (失败次数,失败16次则自动终止)
broken (终止标志,Y/N)
在数据库找到initsid.ini这个配置文件,进行这些选项的配置,
SQL> show parameters job
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes integer 0
数据库配置只有这项,值是0,说明没有设置
修改可执行作业个数为20个
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;
这样就可以自动运行JOBL 。
6、一些必要的参数
修改initsid.ora参数
job_queue_processes = 4
job_queue_interval = 10
job_queue_keep_connections=true
修改可执行作业个数为20个
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20
ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20
修改取消限制模式
ALTER SYSTEM DISABLE RESTRICTED SESSION;
ALTER SYSTEM DISABLE RESTRICTED SESSION;
7、两个必要的表
user_jobs及dba_jobs_running
user_jobs及dba_jobs_running