ヘッダーをスキップ
Oracle® Application Expressアプリケーション・ビルダー・ユーザーズ・ガイド
リリース3.2
B53794-04
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

バックグラウンドPL/SQLの実行

APEX_PLSQL_JOBパッケージを使用すると、アプリケーションのバックグラウンドでPL/SQLコードを実行できます。操作が完了していない状態でもユーザーがアプリケーションで作業を継続できるため、長時間実行操作の管理に有効な方法です。

この項に含まれる内容は次のとおりです。

APEX_PLSQL_JOBパッケージの理解

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パッケージ: 使用可能なファンクション

ファンクションまたはプロシージャ 説明

SUBMIT_PROCESS

このプロシージャを使用すると、バックグラウンドPL/SQLを送信できます。このプロシージャは、一意のジョブ番号を戻します。このジョブ番号は、このパッケージ内の他のプロシージャおよびファンクションの参照点として使用できるため、自分のスキーマ内に格納しておくと役に立ちます。

UPDATE_JOB_STATUS

このプロシージャをコールすると、現在実行しているジョブのステータスを更新できます。このプロシージャは、送信されたPL/SQLからコールされたときに最も有効です。

TIME_ELAPSED

このファンクションを使用すると、ジョブが送信されてから経過した時間を確認できます。

JOBS_ARE_ENABLED

このファンクションをコールすると、そのデータベースが現在、APEX_PLSQL_JOBパッケージへのジョブの送信をサポートするモードであるかどうかを確認できます。

PURGE_PROCESS

このプロシージャをコールすると、送信されたジョブをクリーンアップできます。送信されたジョブは、Oracle Application Expressによってそれらのレコードがクリーンアップされるか、またはPURGE_PROCESSのコールによって手動で削除するまで、APEX_PLSQL_JOBSビューに保持されます。


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ビュー列

名前 説明

ID

列ごとに一意の識別子です。

JOB

送信された各PL/SQLジョブに割り当てられたジョブ番号です。この値を戻すには、APEX_PLSQL_JOB.SUBMIT_PROCESSファンクションを使用します。これは、APEX_PLSQL_JOBパッケージ内の他のプロシージャおよびファンクションに渡す値でもあります。

FLOW_ID

このジョブの送信元のアプリケーションです。

OWNER

アプリケーションを所有するデータベース・スキーマです。この値は、DBMS_JOBがこのコードを実行する際に、コードを解析するスキーマを識別します。

ENDUSER

このプロセスを送信させたエンド・ユーザー(アプリケーションにログインしたユーザー)です。

CREATED

ジョブが送信された日付です。

MODIFIED

ステータスが変更された日付です。

STATUS

このジョブに対してユーザーが定義したステータスです。この列を更新するには、APEX_PLSQL_JOB.UPDATE_JOB_STATUSをコールします。

SYSTEM_STATUS

このジョブに対してシステムが定義したステータスです。

SYSTEM_MODIFIED

システム・ステータスが変更された日付です。

SECURITY_GROUP_ID

ワークスペースに割り当てられた一意のIDです。開発者は、自分のワークスペースから送信されたジョブのみを参照できます。



関連項目:

Oracle Application Express APIリファレンスの「APEX_PLSQL_JOBS」

システム・ステータスの更新について

送信されたジョブには、次のいずれかのシステム・ステータス設定が含まれています。

  • SUBMITTED: ジョブが送信済であるが、開始されていないことを示します。DBMS_JOBでは、ジョブの即時開始は保証されていません。

  • IN PROGRESS: DBMS_JOBがプロセスを開始したことを示します。

  • COMPLETED: ジョブが完了したことを示します。

  • BROKEN (sqlcode) sqlerrm: ジョブに問題があり、エラーが発生したことを示します。エラーが発生したことを示すSQLコードおよびSQLエラー・メッセージがシステム・ステータスに表示されます。この情報を参照して、エラーの原因を判別してください。

プロセスを使用したバックグラウンドPL/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つの理由から重要です。

    1. 「100行が挿入されました」というステータスが表示される場合でも、操作全体が成功したわけではありません。コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、APEX_PLSQL_JOBSuser_status列は影響を受けません。

    2. 更新は自律的に実行されます。ジョブが完了する前にジョブ・ステータスを表示できます。これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。