Plsql DBMS_ALERT.WAITANY会挂起一段时间
我有一份工作,它将提交n份其他工作。我已经设置了pl/sql过程,以便使用dbms_alert.register注册n个作业。每个作业都将发送dbms_alert.signal。信号发出后,我立即发出了一份承诺 但有时它会挂在处理它们的服务器上。下面是同样的代码片段。所有警报/作业都会更新或插入到不同的表中。他们可能需要使用select查询来获取相同或不同表的数据/记录。任何人都可以找到导致服务器上出现此挂起问题的原因Plsql DBMS_ALERT.WAITANY会挂起一段时间,plsql,Plsql,我有一份工作,它将提交n份其他工作。我已经设置了pl/sql过程,以便使用dbms_alert.register注册n个作业。每个作业都将发送dbms_alert.signal。信号发出后,我立即发出了一份承诺 但有时它会挂在处理它们的服务器上。下面是同样的代码片段。所有警报/作业都会更新或插入到不同的表中。他们可能需要使用select查询来获取相同或不同表的数据/记录。任何人都可以找到导致服务器上出现此挂起问题的原因 FUNCTION GenBociCltStm RETURN NUMBER
FUNCTION GenBociCltStm RETURN NUMBER
.......
.........
.......
-- The following can be executed in any order (and in parallel)
dbms_alert.register('CltMstAlert');
dbms_alert.register('TrdPstAlert');
dbms_alert.register('TrdLegAllAlert');
dbms_alert.register('CrpActPstAlert');
dbms_alert.register('SttPstAlert');
dbms_alert.register('StkMovAlert');
dbms_alert.register('StkHldAlert');
dbms_alert.register('IntAlert');
dbms_alert.register('TermLoanAlert');
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmCltMst;
exception when others then
NULL;
END;
dbms_alert.signal(''CltMstAlert'', ''GenBociCltStmCltMst Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmTrdPst;
exception when others then
NULL;
END;
dbms_alert.signal(''TrdPstAlert'', ''GenBociCltStmTrdPst Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmTrdLegAll;
exception when others then
NULL;
END;
dbms_alert.signal(''TrdLegAllAlert'', ''GenBociCltStmTrdLegAll Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmCrpActPst;
exception when others then
NULL;
END;
dbms_alert.signal(''CrpActPstAlert'', ''GenBociCltStmCrpActPst Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmSttPst;
exception when others then
NULL;
END;
dbms_alert.signal(''SttPstAlert'', ''GenBociCltStmSttPst Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmStkMov;
exception when others then
NULL;
END;
dbms_alert.signal(''StkMovAlert'', ''GenBociCltStmStkMov Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmStkHld;
exception when others then
NULL;
END;
dbms_alert.signal(''StkHldAlert'', ''GenBociCltStmStkHld Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmInt;
exception when others then
NULL;
END;
dbms_alert.signal(''IntAlert'', ''GenBociCltStmInt Complete''); commit;',
SYSDATE
);
dbms_job.submit ( l_job,
' BEGIN
PkgBociCltStmGen.GenBociCltStmTrmLon;
exception when others then
NULL;
END;
dbms_alert.signal(''TermLoanAlert'', ''GenBociCltStmTrmLon Complete''); commit;',
SYSDATE
);
commit;
......
......
......
LOOP
DBMS_ALERT.WAITANY(l_name, l_msg, l_status,6000);
IF g_debug THEN
SP_DEBUGLOG('===> alert '|| l_name,FALSE);
END IF;
l_counter := l_counter - 1;
IF l_counter = 0 THEN
EXIT;
END IF;
END LOOP;
任何建议都将不胜感激 当你说它挂起时,你的意思是它没有像预期的那样响应信号吗?它应该“挂起”。我认为简化的测试用例和一些格式化会得到更好的答案。基本上我们从C++代码中调用这个包。当它挂起时,它永远不会返回到C++代码。它就是这样挂着的