如题:
举例说明:
A会话执行一个存储过程aa(欲写表aaa),
B会话执行一个存储过程bb(完成写表bbb动作)。
如何实现:在A会话中执行的过程aa发起后,
一直等待,
直到B会话执行的过程bb中完成了写表bbb的动作后,
才写表aaa貌似在过程aa中写个递归调用,不停的调它自己(aa),无法实现,当oracle发现等待过长,会自动退出。希望能找到解决办法。
举例说明:
A会话执行一个存储过程aa(欲写表aaa),
B会话执行一个存储过程bb(完成写表bbb动作)。
如何实现:在A会话中执行的过程aa发起后,
一直等待,
直到B会话执行的过程bb中完成了写表bbb的动作后,
才写表aaa貌似在过程aa中写个递归调用,不停的调它自己(aa),无法实现,当oracle发现等待过长,会自动退出。希望能找到解决办法。
等着bb的执行结果,然后继续执行aa中的其他内容,(而不是把bb交给job之后就直接处理这些‘其他内容’)ps:
问:为什么不在bb中执行aa后续将要完成的内容呢?
答:因为aa中用DBMS_JOB.submit可能不仅仅发起一个过程可能有bb,也可能有cc……
如果这些‘将要完成的内容’写在bb中将不仅影响程序的可读性,而且对编码来讲
也不是件简单的事情。
因为要利用job 使用并发,如果在aa里直接调用bb,就成了串行执行了……
恩没错,但这个是判断的条件,这个地方需要用的应该是一个什么样的命令,语法比如:wait;正如我刚才说的,如果这个地方条件不成立,则不停地goto到判断条件之上,oracle是不允许的,
若干分钟之后,就会退出(报错)。当然了,可以通过设置这个等待时间,但是多长合适呢……
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>