Oracle® Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド リリース4.2 for Oracle Database 12c B71338-03 |
|
前 |
次 |
APEX_PLSQL_JOB
パッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。
APEX_PLSQL_JOB
は、Oracle Databaseで提供されるDBMS_JOB
機能をラップしたラッパー・パッケージです。APEX_PLSQL_JOB
パッケージでは、PL/SQLをバックグラウンドで実行するために必要な機能のみが公開されることに注意してください。
表17-2に、APEX_PLSQL_JOB
パッケージで使用可能なファンクションを示します。
表 17-2 APEX_PLSQL_JOBパッケージ: 使用可能なファンクション
ファンクションまたはプロシージャ | 説明 |
---|---|
|
このプロシージャを使用すると、バックグラウンドPL/SQLを送信できます。このプロシージャは、一意のジョブ番号を戻します。このジョブ番号は、このパッケージ内の他のプロシージャおよびファンクションの参照点として使用できるため、自分のスキーマ内に格納しておくと役に立ちます。 |
|
このプロシージャをコールすると、現在実行しているジョブのステータスを更新できます。このプロシージャは、送信されたPL/SQLからコールされたときに最も有効です。 |
|
このファンクションを使用すると、ジョブが送信されてから経過した時間を確認できます。 |
|
このファンクションをコールすると、そのデータベースが現在、 |
|
このプロシージャをコールすると、送信されたジョブをクリーンアップできます。送信されたジョブは、Oracle Application Expressによってそれらのレコードがクリーンアップされるか、または |
APEX_PLSQL_JOB
パッケージに送信したすべてのジョブは、APEX_PLSQL_JOB
ビューで表示できます。
Oracle Application Express用のすべてのApplication Program Interfaceパッケージの完全な説明については、『Oracle Application Express APIリファレンス』を参照してください。
関連項目: Oracle Application Express APIリファレンスの「APEX_PLSQL_JOB」 |
送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。
SUBMITTED: ジョブが送信済であるが、開始されていないことを示します。DBMS_JOB
では、ジョブの即時開始は保証されていません。
IN PROGRESS: DBMS_JOB
がプロセスを開始したことを示します。
COMPLETED: ジョブが完了したことを示します。
BROKEN (sqlcode) sqlerrm: ジョブに問題があり、エラーが発生したことを示します。エラーが発生したことを示すSQLコードおよびSQLエラー・メッセージがシステム・ステータスに表示されます。この情報を参照して、エラーの原因を判別してください。
テストおよび説明用に、PL/SQLジョブをバックグラウンドで実行する例を次に示します。
001 BEGIN 002 FOR i IN 1 .. 100 LOOP 003 INSERT INTO emp(a,b) VALUES (:APP_JOB,i); 004 IF MOD(i,10) = 0 THEN 005 APEX_PLSQL_JOB.UPDATE_JOB_STATUS( 006 P_JOB => :APP_JOB, 007 P_STATUS => i || 'rows inserted'); 008 END IF; 009 APEX_UTIL.PAUSE(2); 010 END LOOP; 011 END;
この例の説明を次に示します。
002から010行では、100個のレコードをemp
表に挿入するループを実行します。
APP_JOB
は、INSERTのVALUE句内でバインド変数として参照され、UPDATE_JOB_STATUS
へのコール内でP_JOB
パラメータの値として指定されます。
APP_JOB
は、APEX_PLSQL_JOB
に送信される際に、このプロセスに割り当てられるジョブ番号を表します。プロセス・コード内にこの予約アイテムを指定すると、実行時に実際のジョブ番号に置換されます。
この例では、コード・ブロック内で、10個のレコードごとにUPDATE_JOB_STATUS
がコールされることに注意してください。通常、Oracleトランザクション規則では、コード・ブロック内で実行された更新は、トランザクション全体がコミットされるまで表示されません。一方、APEX_PLSQL_JOB.UPDATE_JOB_STATUS
プロシージャは、ジョブが成功したか失敗したかにかかわらず更新が実行されるように実装されています。このことは、次の2つの理由から重要です。
ステータスが「100 rows inserted」の場合でも、操作全体が成功したわけではありません。コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、APEX_PLSQL_JOBS
のuser_status
列は影響を受けません。
更新は自律的に実行されます。ジョブが完了する前にジョブ・ステータスを表示できます。これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。