我现在有个每分钟跑一次得package
每分钟 oracle job会跑package中的一个procudre run_allprocedure run_all
begin
  cursor Object_pool
   select * from  table
   where type in ('A','B','') 
  ....
  for rec in Object_pool loop
    if rec.type = 'A' then
      A;
    elsif rec.type = 'B' then
      B;
    ...
  end loop;
end;run_all中先打开一个cursor,把要处理的内容查询出来后面循环结果集,针对不同type,调用不同procedure A B
刚开始type很少,半分钟就跑完了,随着type的增多,整个package的运行时间越来越多。
还有一个问题就是如果package 某个type出问题了,会影响所有type现在我一方面优化sql,尽量把时间缩短,但是以后type多了,恐怕时间还是会越来越长,最终一分钟跑不完请教是否有别的方法可以重新架构一下,能解决这种问题
还想过一个方法就是把不同type分开来,把一个oracle job分为几个这种会建立很多job,好像也不是十分完美,而且DBA也不一定同意....

解决方案 »

  1.   

    可以约定一个规则,然后根据规则动态去调用不同的过程,比如A,则调用aProcedure()等等,然后将来有新的type了,则直接创建新的procedure就行了。这个叫做:策略模式。没有在数据库里用过这种方式,你可以试试。
      

  2.   


    我这边结果集中是一条一条处理的不同的procedure的规则是相应的用户提供的
      

  3.   

    那也可以维护一张表,这张表里存储两列:条件(就是你上边的A,B等)、procedure名称。然后到时候新增加了procedure,则只需要维护这张表就行了,你现在写的这个程序里,只需要从这张表里去取每条数据,然后去逐个执行就行了。这个表就相当于是个java里的xml配置文件。
      

  4.   


    dbms_job.submit('A;B;C',sysdate,'trunc(sysdate+1)');
    我想把几个procedure 同时submit到job中procedure A B C等用到了我package中的全局变量及一个临时表不知道这样会不会相互影响