APEX_PLSQL_JOB
パッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。
この項に含まれる内容は次のとおりです。
APEX_PLSQL_JOB
は、Oracle Databaseで提供されるDBMS_JOB
機能をラップしたラッパー・パッケージです。APEX_PLSQL_JOB
パッケージでは、PL/SQLをバックグラウンドで実行するために必要な機能のみが公開されることに注意してください。APEX_PLSQL_JOB
パッケージの記述を次に示します。
SQL> DESC APEX_PLSQL_JOB FUNCTION JOBS_ARE_ENABLED RETURNS BOOLEAN PROCEDURE PURGE_PROCESS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN FUNCTION SUBMIT_PROCESS RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_SQL VARCHAR2 IN P_WHEN VARCHAR2 IN DEFAULT P_STATUS VARCHAR2 IN DEFAULT FUNCTION TIME_ELAPSED RETURNS NUMBER Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN PROCEDURE UPDATE_JOB_STATUS Argument Name Type In/Out Default? ------------------------------ ----------------------- ------ -------- P_JOB NUMBER IN P_STATUS VARCHAR2 IN
表15-1に、APEX_PLSQL_JOB
パッケージで使用可能なファンクションを示します。
表 15-3 APEX_PLSQL_JOBパッケージ: 使用可能なファンクション
ファンクションまたはプロシージャ | 説明 |
---|---|
|
このプロシージャを使用すると、バックグラウンドPL/SQLを送信できます。このプロシージャは、一意のジョブ番号を戻します。このジョブ番号は、このパッケージ内の他のプロシージャおよびファンクションの参照点として使用できるため、自分のスキーマ内に格納しておくと役に立ちます。 |
|
このプロシージャをコールすると、現在実行しているジョブのステータスを更新できます。このプロシージャは、送信されたPL/SQLからコールされたときに最も有効です。 |
|
このファンクションを使用すると、ジョブが送信されてから経過した時間を確認できます。 |
|
このファンクションをコールすると、そのデータベースが現在、 |
|
このプロシージャをコールすると、送信されたジョブをクリーンアップできます。送信されたジョブは、Oracle Application Expressによってそれらのレコードがクリーンアップされるか、または |
APEX_PLSQL_JOB
パッケージに送信したすべてのジョブは、APEX_PLSQL_JOBS
ビューで表示できます。APEX_PLSQL_JOBS
ビューの記述を次に示します。
SQL> DESCRIBE APEX_PLSQL_JOBS Name Null? Type --------------------------------- -------- ---------------------------- ID NUMBER JOB NUMBER FLOW_ID NUMBER OWNER VARCHAR2(30) ENDUSER VARCHAR2(30) CREATED DATE MODIFIED DATE STATUS VARCHAR2(100) SYSTEM_STATUS VARCHAR2(4000) SYSTEM_MODIFIED DATE SECURITY_GROUP_ID NUMBER
表 15-4に、APEX_PLSQL_JOBS
ビューで使用可能な列を示します。
表 15-4 APEX_PLSQL_JOBSビュー列
名前 | 説明 |
---|---|
|
列ごとに一意の識別子です。 |
|
送信された各PL/SQLジョブに割り当てられたジョブ番号です。この値を戻すには、 |
|
このジョブの送信元のアプリケーションです。 |
|
アプリケーションを所有するデータベース・スキーマです。この値は、 |
|
このプロセスを送信させたエンド・ユーザー(アプリケーションにログインしたユーザー)です。 |
|
ジョブが送信された日付です。 |
|
ステータスが変更された日付です。 |
|
このジョブに対してユーザーが定義したステータスです。この列を更新するには、 |
|
このジョブに対してシステムが定義したステータスです。 |
|
システム・ステータスが変更された日付です。 |
|
ワークスペースに割り当てられた一意のIDです。開発者は、自分のワークスペースから送信されたジョブのみを参照できます。 |
関連項目: Oracle Application Express APIリファレンスの「APEX_PLSQL_JOBS」 |
送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。
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行が挿入されました」というステータスが表示される場合でも、操作全体が成功したわけではありません。コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、APEX_PLSQL_JOBS
のuser_status
列は影響を受けません。
更新は自律的に実行されます。ジョブが完了する前にジョブ・ステータスを表示できます。これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。