fnd_concurrent.wait_for_request等待时间设置

     在ebs里面,经常会使用一个并发请求带出另外一个并发请求,这时候我们就可以需要等子的一个并发请求执行完了之后,在继续原来的并发请求,所以在ebs里面有一个等待的机制,其应用的说明如下:

语法:

FUNCTION fnd_concurrent.wait_for_request(request_id IN NUMBER DEFAULT NULL,
                                         INTERVAL   IN NUMBER DEFAULT 60,
                                         max_wait   IN NUMBER DEFAULT 0,
                                         phase      OUT VARCHAR2,
                                         status     OUT VARCHAR2,
                                         dev_phase  OUT VARCHAR2,
                                         dev_status OUT VARCHAR2,
                                         message    OUT VARCHAR2) RETURN BOOLEAN;

说明:等待并发请求的完成,然后返回请求的阶段、状态以及完成消息。在等待的过程中每隔一段时间检查一下。

输入参数说明:

request_id:  并发请求的id

interval:  两次检查见等待的秒数,两次检查之间该程序会休息

max_wait: 等待并发请求完成所能等待的的最长时间,单位为秒。

 

但是这里面的max_wait就是我们需要等待的时间,但是如果子请求的数据大,或者数据跑的很慢的话,会导致父请求提前执行,这个显然是有问题的,上次就遇到一个问题,子请求没执行完,但是父请求需要用子请求的结果来做判断,而且也没有判断子请求是不是正常完成,导致意想不到的错误。

其实我们需要的就是一直等待,知道程序执行完了为止:

 

然后做了一个实验:

程序1:

(更新一个表)

CREATE OR REPLACE PACKAGE BODY cux_sanwen_test1 AS
  PROCEDURE main(errbuf OUT VARCHAR2, retcode OUT NUMBER) IS
  BEGIN
    update CUX_SANWEN_DEBUG v set v.debug_info=’test’;
    COMMIT;
  END;
END cux_sanwen_test1;

 

程序2:

(调用程序1)

CREATE OR REPLACE PACKAGE BODY cux_sanwen_test2 AS
  PROCEDURE main(errbuf OUT VARCHAR2, retcode OUT NUMBER) IS
  begin
    if (submit_request) then
      dbms_output.put_line(’1212′);
    end if;
  END;

  /*==================================================
  Procedure Name :
      submit_request
  Description:
      提交并发请求:’日记账导入’
  Argument:
  ==================================================*/
  function submit_request return boolean is
    p_request_id number;
    p_wait       boolean;
    p_phase      varchar2(80);
    p_status     varchar2(80);
    p_dev_phase  varchar2(80);
    p_dev_status varchar2(80);
    p_message    varchar2(80);
  begin
    p_request_id := fnd_request.submit_request(application => ‘CUX’, –应用简称
                                               program     => ‘CUXTEST1′, –并发简称:日记帐导入
                                               description => ”, –说明
                                               start_time  => ”, –请求开始时间,格式为标准日期格式,为空表示立即开始
                                               sub_request => false); –是否子请求);
                    commit;
    if p_request_id = 0 then
      return false;
    end if;
    — wait request
    p_wait := fnd_concurrent.wait_for_request(request_id => p_request_id,
                                              interval   => 1, — interval second for check
                                              max_wait   => 0, — max_wait, Max amount of time to wait (in seconds)
                                              phase      => p_phase,
                                              status     => p_status,
                                              dev_phase  => p_dev_phase,
                                              dev_status => p_dev_status,
                                              message    => p_message);
    if p_wait and p_dev_phase = ‘COMPLETE’ and p_dev_status = ‘NORMAL’ then
      return true;
    else
      return false;
    end if;
  end submit_request;
END cux_sanwen_test2;

 

锁住表:

SELECT * FROM cux_sanwen_debug for update;

 

这样当设置时间超时的时候,父请求就不等子请求开始执行了,但是设置为0的话,就会一直等待!

共有 0 条评论

Top