ホーム > 高度なプログラミング手法 > バックグラウンドPL/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つの理由から重要です。
「100行が挿入されました」というステータスが表示される場合でも、操作全体が成功したわけではありません。コード・ブロックでコミットが試行されたときにエラーが発生した場合、ステータスの更新は個別にコミットされるため、APEX_PLSQL_JOBS
のuser_status
列は影響を受けません。
更新は自律的に実行されます。ジョブが完了する前にジョブ・ステータスを表示できます。これによって、バックグラウンドで実行中の各操作についてステータス・テキストを表示できます。