最近在做一个关于ERP的项目,其中涉及到了物料导入的内容,采用了提交请求(FND_REQUEST.SUBMIT_REQUEST)的方式进行导入。在导入的过程中遇到了一个问题:导入物料基本信息与分类信息是分作两次请求进行提交的,导入分类信息的请求必须是物料基本信息请求提交成功后才提交的,于是就用到了FND_CONCURRENT.WAIT_FOR_REQUEST来等待物料基本信息导入成功后再继续执行后续内容,但是用了这个方法之后就一直卡在这个位置一直不动,下面是具体代码:
DBMS_OUTPUT.PUT_LINE('-----------------提交物料数据请求!----------------');
--提交请求
V_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => 'INV',
PROGRAM => 'INCOIN',
DESCRIPTION => 'CUX:',
START_TIME => SYSDATE,
SUB_REQUEST => FALSE,
ARGUMENT1 => master_org_id, -- ORGANIZATION ID
ARGUMENT2 => 1, -- ALL ORGANIZATIONS
ARGUMENT3 => 1, -- VALIDATE ITEMS
ARGUMENT4 => 1, -- PROCESS ITEMS
ARGUMENT5 => 1, -- DELETE PROCESSED ROWS
ARGUMENT6 => P_REQUEST_GRO_ID, -- PROCESS SET (NULL FOR ALL)
ARGUMENT7 => 1, -- CREATE OR UPDATE ITEMS
ARGUMENT8 => 1 -- GATHER STATISTICS
);
DBMS_OUTPUT.PUT_LINE('--提交物料数据请求结果:' || V_REQUEST_ID || '--');
IF (V_REQUEST_ID <> 0) THEN
DBMS_OUTPUT.PUT_LINE('-----------------开始更新物料关联数据!----------------');
V_FINISHED := FND_CONCURRENT.WAIT_FOR_REQUEST(REQUEST_ID => V_REQUEST_ID,
INTERVAL => 5,
MAX_WAIT => 0,
PHASE => V_PHASE,
STATUS => V_STATUS,
DEV_PHASE => V_REQUEST_PHASE,
DEV_STATUS => V_REQUEST_STATUS,
MESSAGE => V_MESSAGE);
IF UPPER(V_REQUEST_PHASE) = 'COMPLETE' AND UPPER(V_REQUEST_STATUS) = 'NORMAL' THEN
DBMS_OUTPUT.PUT_LINE('-----------------更新物料关联数据!----------------');
END IF;
END IF;
执行后就一直卡在FND_CONCURRENT.WAIT_FOR_REQUEST这个位置,一直没反应。经过在网上不断的找例子,最终发现在请求提交之后需要COMMIT一下,也就是说在FND_REQUEST.SUBMIT_REQUEST之后需要提交事务,具体的原因我猜测请求提交应该也是向某张表里面插入数据,因此事务没提交的时候,等待的请求是空的,而我又没有设置等待时间,就导致了一直卡在那儿,因此只需要加上COMMIT就好了。
下面是修改后的代码:
DBMS_OUTPUT.PUT_LINE('-----------------提交物料数据请求!----------------');
--提交请求
V_REQUEST_ID := FND_REQUEST.SUBMIT_REQUEST(APPLICATION => 'INV',
PROGRAM => 'INCOIN',
DESCRIPTION => 'CUX:',
START_TIME => SYSDATE,
SUB_REQUEST => FALSE,
ARGUMENT1 => master_org_id, -- ORGANIZATION ID
ARGUMENT2 => 1, -- ALL ORGANIZATIONS
ARGUMENT3 => 1, -- VALIDATE ITEMS
ARGUMENT4 => 1, -- PROCESS ITEMS
ARGUMENT5 => 1, -- DELETE PROCESSED ROWS
ARGUMENT6 => P_REQUEST_GRO_ID, -- PROCESS SET (NULL FOR ALL)
ARGUMENT7 => 1, -- CREATE OR UPDATE ITEMS
ARGUMENT8 => 1 -- GATHER STATISTICS
);
---------------------------------------在这里加上COMMIT语句就可以了
COMMIT;
DBMS_OUTPUT.PUT_LINE('--提交物料数据请求编号:' || V_REQUEST_ID || '--');
IF (V_REQUEST_ID <> 0) THEN
DBMS_OUTPUT.PUT_LINE('-----------------开始更新物料关联数据!----------------');
V_FINISHED := FND_CONCURRENT.WAIT_FOR_REQUEST(REQUEST_ID => V_REQUEST_ID,
INTERVAL => 5,
MAX_WAIT => 0,
PHASE => V_PHASE,
STATUS => V_STATUS,
DEV_PHASE => V_REQUEST_PHASE,
DEV_STATUS => V_REQUEST_STATUS,
MESSAGE => V_MESSAGE);
IF UPPER(V_REQUEST_PHASE) = 'COMPLETE' AND UPPER(V_REQUEST_STATUS) = 'NORMAL' THEN
DBMS_OUTPUT.PUT_LINE('-----------------更新物料关联数据!----------------');
/*.........*/
END IF;
END IF;