2

我是Developer2000 的新手。我有一个 Oracle pl/sql 过程(比如 proc_submit_request),它获取数千个请求并将它们提交给 dbms_job 调度程序。dbms_job 的调用是

为每个获取的请求在循环内编码。

目前,我在 oracle 表单屏幕中有一个按钮(例如,提交按钮),单击它调用 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 完成以下事情吗?

  1. 在调用 open_form('Form-2',OTHER-ARGUMENTS...) 时,控件必须在 Form-1 中(即用户不应该知道正在打开另一个表单)并且 Form-2 应该调用 proc_submit_request。

  2. 用户必须能够导航到应用程序中的其他屏幕。但在 proc_submit_procedure 完成之前,Form-2 必须仍在运行。

  3. 如果用户关闭(退出) Form-1 会发生什么?Form-2 会继续运行吗?

请给我答案或提出一个好的解决方案。

4

2 回答 2

0

您可以创建一个 DBMS_JOB 来调用 proc_submit_request。这样你的表格就只需要打一个电话;并且所有其他作业的创建将在单独的会话中完成。

于 2012-08-29T07:51:45.833 回答
0

关于 Form-1、Form-2 场景的好想法 - 我不确定这是否可行。但是这是一种更简单的方法,而不必摸索隐藏和运行东西的协调表单,并在函数实际返回时出现在最前沿......等等。

重写运行数据库作业的函数以作为AUTONOMOUS_TRANSACTION. 查看编译器指令PRAGMA AUTONOMOUS_TRANSACTION以获取更多详细信息。您必须在数据库函数/包/过程中使用它 - 它对表单无效(至少表单 10,不确定 11)。

CREATE_TIMER然后,您可以将作业结果存储在您的函数(包变量、表等)的某处,然后使用与表单级别触发器一起调用的内置函数,WHEN-TIMER-EXPIRED每 10 秒左右检查一次存储位置 - 然后您可以向用户显示有关作业的消息,并使用 终止计时器DELETE_TIMER

于 2011-01-21T19:12:35.877 回答