我是Developer2000的新手。 我有一个Oracle pl / sql过程(比如proc_submit_request),它获取数千个请求并将它们提交给dbms_job调度程序。 dbms_job的调用是
在获取的每个请求的循环内编码。
目前,我在oracle表单屏幕中点击一个按钮(例如,SUBMIT按钮),调用proc_submit_request。 这里的问题是......控件没有返回到我的屏幕,直到所有提取的请求都被提交到dbms_job(这需要几个小时才能完成) 屏幕灰显,只有小时玻璃出现,直到程序proc_submit_request完成。 proc_submit_appears向屏幕返回一条消息,告诉“提交XXXX请求”。
我现在的要求是,一旦用户点击“提交”按钮,屏幕就不再灰显。用户应该能够导航到其他屏幕,而不仅仅是使用提交屏幕,直到被调用的程序完成。
我建议运行侦听器(shell脚本和perl东西),它们可以侦听管道中的任何消息并以后台进程运行请求。 但是用户要求我在应用程序中修复问题,而不是运行监听器。
我听说过一些内置的OPEN_FORM。 假设我有两种形式,即Form-1和Form-2。 Form-1使用OPEN_FORM调用Form-2。 现在使用OPEN_FORM可以做以下事情吗?
在调用open_form('Form-2',OTHER-ARGUMENTS ...)时,控件必须是Form-1(即USer不应该知道另一个表单正在打开)而Form-2应该调用proc_submit_request。
用户必须能够导航到应用程序中的其他屏幕。但是,在proc_submit_procedure完成之前,Form-2仍然必须运行。
如果用户关闭(退出)Form-1会怎样? Form-2还会继续运行吗?
请给我答案或建议一个好的解决方案。
答案 0 :(得分:0)
对Form-1,Form-2场景的好想法 - 我不确定这是否有效。但是这里有一个更简单的方法,无需在隐藏和运行东西的协调表格中摸索,并在函数实际返回等等时出现在最前沿。
重写运行数据库作业的函数以AUTONOMOUS_TRANSACTION
运行。有关详细信息,请查看编译器指令PRAGMA AUTONOMOUS_TRANSACTION
。您必须在数据库函数/包/过程中使用它 - 它对表单无效(至少表单10,不确定11)。
然后,您可以将作业结果存储在函数(包变量,表等)的某个位置,然后使用内置的名为CREATE_TIMER
和表单级别触发器WHEN-TIMER-EXPIRED
来执行每隔10秒检查一次您的存储位置 - 然后您可以向用户显示有关作业的消息,并使用DELETE_TIMER
终止计时器。
答案 1 :(得分:0)
您可以创建一个DBMS_JOB来调用proc_submit_request。这样你的表单只需拨打一个电话;所有其他工作的创建将在一个单独的会议中完成。