如题:
举例说明:
  A会话执行一个存储过程aa(欲写表aaa),
  B会话执行一个存储过程bb(完成写表bbb动作)。
  
  如何实现:在A会话中执行的过程aa发起后,
            一直等待,
            直到B会话执行的过程bb中完成了写表bbb的动作后,
            才写表aaa貌似在过程aa中写个递归调用,不停的调它自己(aa),无法实现,当oracle发现等待过长,会自动退出。希望能找到解决办法。

解决方案 »

  1.   

    说白了,是这样的:自己顶!我在aa中用DBMS_JOB.submit执行了bb但aa始终是外壳程序,我想让aa执行完DBMS_JOB.submit这一句之后
    等着bb的执行结果,然后继续执行aa中的其他内容,(而不是把bb交给job之后就直接处理这些‘其他内容’)ps:
      问:为什么不在bb中执行aa后续将要完成的内容呢?
      答:因为aa中用DBMS_JOB.submit可能不仅仅发起一个过程可能有bb,也可能有cc……
          如果这些‘将要完成的内容’写在bb中将不仅影响程序的可读性,而且对编码来讲
          也不是件简单的事情。
      

  2.   


    因为要利用job 使用并发,如果在aa里直接调用bb,就成了串行执行了……
      

  3.   

    利用job去调用一个过程,等待他执行完毕后继续执行,跟直接调用好像没区别啊.怎么用job实现的并发呢?
      

  4.   

    哦,了解了,应该是调用了n个submit.
      

  5.   

    可以这样,submit会返回job号,通过job号对表dba_jobs进行检索,如果对应的job记录不存在了就是job运行完了.
      

  6.   

    还是检索user_jobs吧.可以利用一个循环,根据你的job运行时长来决定dbms_lock.sleep的秒数.比如10分钟的,可以每次sleep 60秒或120秒.
      

  7.   


    恩没错,但这个是判断的条件,这个地方需要用的应该是一个什么样的命令,语法比如:wait;正如我刚才说的,如果这个地方条件不成立,则不停地goto到判断条件之上,oracle是不允许的,
    若干分钟之后,就会退出(报错)。当然了,可以通过设置这个等待时间,但是多长合适呢……
      

  8.   

    首先sys赋予scott权限
    SQL> grant execute on dbms_lock to scott;
     
    Grant succeeded
     
    SQL> 
    然后创建过程并执行测试.
    SQL> create or replace procedure proc_check_job
      2  as
      3  v_job1   number(10);
      4  v_job2   number(10);
      5  v_num    number(10);
      6  begin
      7  
      8    dbms_job.submit(v_job1,'declare  v_num number(10); begin select 1 into v_num from dual; end;',SYSDATE,null);
      9    dbms_job.submit(v_job2,'declare  v_num number(10); begin select 1 into v_num from dual; end;',SYSDATE,null);
     10    commit;
     11    dbms_output.put_line('now job created');
     12  
     13    loop
     14    select count(*) into v_num from user_jobs t where t.job in (v_job1,v_job2);
     15    exit when v_num=0;
     16      dbms_lock.sleep(10);
     17      dbms_output.put_line('job doing ');
     18    end loop;
     19    dbms_output.put_line('job done ');
     20  
     21  end;
     22  /
     
    Procedure created
     
    SQL> set serveroutput on
    SQL> exec proc_check_job;
     
    now job created
    job doing 
    job done 
     
    PL/SQL procedure successfully completed
     
    SQL>