2

私は Developer2000 の初心者です。何千ものリクエストを取得して dbms_job スケジューラに送信する Oracle pl/sql プロシージャ (proc_submit_request など) があります。dbms_job の呼び出しは

フェッチされたリクエストごとにループ内でコーディングされます。

現在、proc_submit_requestを呼び出すオラクルフォーム画面のクリックにボタン(たとえば、SUBMITボタン)があります。ここでの問題は...フェッチされたすべてのリクエストがdbms_jobに送信されるまで、コントロールが画面に戻らないことです(これには完了するまでに数時間かかります)画面がグレーアウトし、手順が完了するまで砂時計だけが表示されますproc_submit_request. proc_submit_appears は、「XXXX リクエストが送信されました」というメッセージを画面に返します。

私の要件は、ユーザーが [SUBMIT] ボタンをクリックすると、画面が灰色にならないようにすることです。ユーザーは、呼び出されたプロシージャが完了するまで送信画面を表示するだけでなく、他の画面に移動できる必要があります。

パイプ内のメッセージをリッスンし、バックグラウンド プロセスとしてリクエストを実行できるリスナー (シェル スクリプトや perl など) を実行することを提案しました。しかし、ユーザーは、リスナーを実行するのではなく、アプリケーションで問題を修正するように私に求めています。

OPEN_FORM 組み込みについて少し聞いたことがあります。Form-1 と Form-2 という 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

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 に答える
0

proc_submit_request を呼び出す単一の DBMS_JOB を作成できます。そうすれば、フォームは 1 回だけ呼び出しを行う必要があります。他のすべてのジョブの作成は別のセッションで行われます。

于 2012-08-29T07:51:45.833 に答える