oracle中创建作业(跨表空间)

        需求:每月1日执行,从TableSpace为SDE的几张表中读取每个工程的设施数量,存储于TableSpace为SCOTT的T_DIC_MTTYP中

        环境:PLSQL

        步骤:

 

1. 建立存储过程(在TableSpace为SCOTT下)

create or replace procedure scott.PRO_InsertFacility is
begin
  /*污水管*/
  insert into SCOTT.T_MTFACILITY
  select t2.proid,extract(year from sysdate),extract(month from sysdate),1,sscount 
  from (select pjnm,count(pjnm) as sscount from SDE.污水管 group by pjnm) t1 
  inner join SCOTT.T_PROJECTINFO t2 on t1.pjnm=t2.projectname;
  commit;
  
  /*污水检查井*/
  insert into SCOTT.T_MTFACILITY
  select t2.proid,extract(year from sysdate),extract(month from sysdate),2,sscount 
  from (select pjnm,count(pjnm) as sscount from SDE.污水检查井 group by pjnm) t1 
  inner join SCOTT.T_PROJECTINFO t2 on t1.pjnm=t2.projectname;
  commit;
  
  /*污水泵*/
  insert into SCOTT.T_MTFACILITY
  select t2.proid,extract(year from sysdate),extract(month from sysdate),3,sscount 
  from (select pjnm,count(pjnm) as sscount from SDE.污水泵 group by pjnm) t1 
  inner join SCOTT.T_PROJECTINFO t2 on t1.pjnm=t2.projectname;
  commit;

  /*污水排水口*/
  insert into SCOTT.T_MTFACILITY
  select t2.proid,extract(year from sysdate),extract(month from sysdate),4,sscount 
  from (select pjnm,count(pjnm) as sscount from SDE.污水排水口 group by pjnm) t1 
  inner join SCOTT.T_PROJECTINFO t2 on t1.pjnm=t2.projectname;
  commit;
  
  /*污水排水口*/
  insert into SCOTT.T_MTFACILITY
  select t2.proid,extract(year from sysdate),extract(month from sysdate),5,sscount 
  from (select pjnm,count(pjnm) as sscount from SDE.污水蓄水池 group by pjnm) t1 
  inner join SCOTT.T_PROJECTINFO t2 on t1.pjnm=t2.projectname;
  commit;
end PRO_InsertFacility;

 

2. 此时进行执行时报错:

Compilation errors for PROCEDURE SCOTT.PRO_INSERTFACILITY

Error: PL/SQL: ORA-00942: 表或视图不存在
Line: 34
Text: from (select pjnm,count(pjnm) as sscount from SDE.污水蓄水池 group by pjnm) t1

Error: PL/SQL: SQL Statement ignored
Line: 32
Text: insert into SCOTT.T_MTFACILITY

说明当前用户没有访问SDE方案中污水蓄水池表的select权限,所以要先赋予权限后再次执行存储过程方能成功。

grant select on SDE.污水蓄水池 to scott


3. 建立oracle作业

declare JOB_InsertFacility number;  
begin  
       dbms_job.submit(JOB_InsertFacility,'SCOTT.PRO_InsertFacility;',TRUNC(LAST_DAY(SYSDATE))+1,'TRUNC(LAST_DAY(SYSDATE) + 1)');  
       commit;  
end; 

说明:1)JOB_InsertFacility:此任务在任务队列中的编号

            2)'SCOTT.PRO_InsertFacility;':执行的任务的名称及其输入参数

            3)TRUNC(LAST_DAY(SYSDATE))+1:任务执行的时间

            4)'TRUNC(LAST_DAY(SYSDATE) + 1)':任务执行的时间间隔(指上一次执行结束到下一次开始执行的时间间隔,当interval设置为null时,该job执行结束后,就被从队列中删除。假如我们需要该job周期性地执行,则要用'sysdate+m’表示)

 

4. 查询作业

select * from sys.user_jobs 


5. 执行作业

begin  
dbms_job.run(21);  
commit;  
end; 

注意:21是查询出来的作业编号

 

6. 停止作业

begin   
dbms_job.remove(21);  
commit;  
end; 


 

PS:参考资料

1. http://www.blogjava.net/pdw2009/archive/2007/02/09/99002.html

2. http://www.cnblogs.com/lumnm/archive/2012/08/31/2666155.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值