130 DBMS_PARALLEL_EXECUTE

DBMS_PARALLEL_EXECUTEパッケージを使用すると、表データをパラレルで増分更新できるようになります。

この章のトピックは、次のとおりです:

130.1 DBMS_PARALLEL_EXECUTEの概要

このパッケージを使用すると、次の2つのステップで、表データをパラレルで増分更新できます。

  1. 表内の一連の行を、より小さいサイズのチャンクにグループ化します。

  2. ユーザーが指定した文をこれらのチャンクに対してパラレルで実行し、各チャンクの処理の終了時にコミットします。

このパッケージでは、パラレル実行タスクという概念が導入されています。このタスクによって、PL/SQLブロックのパラレル実行(通常は表データの更新)に関連付けられている様々なステップがグループ分けされます。

すべてのパッケージのサブルーチン(GENERATE_TASK_NAMEファンクションTASK_STATUSプロシージャを除く)はコミットを実行します。

130.2 DBMS_PARALLEL_EXECUTEのセキュリティ・モデル

DBMS_PARALLEL_EXECUTEは、PUBLICに付与されているSYS所有のパッケージです。

ADM_PARALLEL_EXECUTE_TASKロールを持つユーザーは、管理ルーチン(ADM_という接頭辞で修飾されているもの)を実行し、DBAビューにアクセスすることができます。

管理ルーチンは別として、すべてのサブプログラムによって現行のユーザーが所有しているタスクが参照されます。

チャンクをパラレル実行するには、CREATE JOBシステム権限が必要です。

CHUNK_BY_SQLRUN_TASKRESUME_TASKサブプログラムは問合せを要求し、DBMS_SQLを使用して実行します。DBMS_SQLインタフェースの実行者は、問合せがSQLインジェクションを含んでいないことを確認する必要があります。

130.3 DBMS_PARALLEL_EXECUTEの定数

DBMS_PARALLEL_EXECUTEパッケージでは、次の2つの表に示す定数が使用されます。

表130-1 DBMS_PARALLEL_EXECUTEの定数 - チャンク・ステータス値

定数 タイプ 説明

ASSIGNED

NUMBER

1

チャンクが処理の対象として割り当てられています。

PROCESSED

NUMBER

2

チャンクが正常に処理されました。

PROCESSED_WITH_ERROR

NUMBER

3

チャンクは処理されましたが、処理中にエラーが発生しました。

UNASSIGNED

NUMBER

0

チャンクが割り当てられていません

表130-2 DBMS_PARALLEL_EXECUTEの定数 - タスク・ステータス値

定数 タイプ 説明

CHUNKED

NUMBER

5

タスクに関連付けられている表はチャンクされていますが、どのチャンクも処理の対象として割り当てられていません。

CHUNKING

NUMBER

2

タスクに割り当てられている表がチャンクされています。

CHUNKING_FAILED

NUMBER

3

チャンクに失敗しました

CRASHED

NUMBER

9

パラレル実行を使用する場合にのみ該当し、ジョブ・セカンダリ・プロセスがクラッシュしたか、データベースがEXECUTE中にクラッシュした場合に発生し、チャンクがASSIGNEDまたはUNASSIGNEDの状態のままになります。

CREATED

NUMBER

1

タスクがCREATE_TASKプロシージャによって作成されています。

FINISHED

NUMBER

7

すべてのチャンクがエラーなく処理されました。

FINISHED_WITH_ERROR

NUMBER

8

すべてのチャンクが処理されましたが、エラーが発生した場合もあります。

NO_CHUNKS NUMBER

4

タスクに関連付けられた表にチャンクが作成されていません

PROCESSING

NUMBER

6

一部のチャンクが処理の対象として割り当てられているか、または処理されています。

ノート:

絶対値は将来変更される可能性があるため、かわりに定数を使用します。

130.4 DBMS_PARALLEL_EXECUTEのビュー

DBMS_PARALLEL_EXECUTEパッケージでは、次のビューを使用します。

130.5 DBMS_PARALLEL_EXECUTEの例外

次の表に、DBMS_PARALLEL_EXECUTEで発生する例外を示します。

表130-3 DBMS_PARALLEL_EXECUTEで発生する例外

例外 エラー・コード 説明

CHUNK_NOT_FOUND

29499

指定されたチャンクが存在しません。

DUPLICATE_TASK_NAME

29497

同じタスク名が既存のタスクによって使用されています。

INVALID_STATE_FOR_CHUNK

29492

CREATEDまたはCHUNKING_FAILED状態でない表のチャンクを試行します。

INVALID_STATE_FOR_REDSUME

29495

実行の再開を試行しますが、タスクがFINISHED_WITH_ERRORまたはCRASHED状態ではありません。

INVALID_STATE_FOR_RUN

29494

CHUNKED状態でないタスクの実行を試行します。

INVALID_STATUS

29493

チャンク・ステータスへの無効な値の設定を試行します。

INVALID_TABLE

29491

表が物理表ではないか、またはIOTの場合に、ROWIDごとに表のチャンクを試行します。

MISSING_ROLE

29490

ユーザーには、必要なADM_PARALLEL_EXECUTEロールがありません。

TASK_NOT_FOUND

29498

指定されたtask_nameが存在しません。

130.6 DBMS_PARALLEL_EXECUTEの例

次の例では、Oracle Databaseサンプル・スキーマについてのマニュアルのHuman Resources (HR)スキーマに関して実行します。JOB SYSTEM権限でHRスキーマを作成することが、要求されます。

ROWIDごとのチャンク

次の例は、このパッケージの最も一般的な使用方法を示しています。RUN_TASKプロシージャをコールした後、エラーをチェックし、エラーを検出した場合は再実行しています。

DECLARE
  l_sql_stmt VARCHAR2(1000);
  l_try NUMBER;
  l_status NUMBER;
BEGIN
 
  -- Create the TASK
  DBMS_PARALLEL_EXECUTE.CREATE_TASK ('mytask');
 
  -- Chunk the table by ROWID
  DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID('mytask', 'HR', 'EMPLOYEES', true, 100);
 
  -- Execute the DML in parallel
  l_sql_stmt := 'update EMPLOYEES e 
      SET e.salary = e.salary + 10
      WHERE rowid BETWEEN :start_id AND :end_id';
  DBMS_PARALLEL_EXECUTE.RUN_TASK('mytask', l_sql_stmt, DBMS_SQL.NATIVE,
                                 parallel_level => 10);
 
  -- If there is an error, RESUME it for at most 2 times.
  L_try := 0;
  L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('mytask');
  WHILE(l_try < 2 and L_status != DBMS_PARALLEL_EXECUTE.FINISHED) 
  LOOP
    L_try := l_try + 1;
    DBMS_PARALLEL_EXECUTE.RESUME_TASK('mytask');
    L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('mytask');
  END LOOP;
 
  -- Done with processing; drop the task
  DBMS_PARALLEL_EXECUTE.DROP_TASK('mytask');
   
END;
/

ユーザー指定のSQLごとのチャンク

ユーザーはCREATE_CHUNKS_BY_SQLプロシージャを使用して、チャンク・アルゴリズムを指定できます。次の例は、同じmanager_idを持つ行が一緒にまとめられ、1つのチャンクとして処理されることを示しています。

DECLARE
  l_chunk_sql VARCHAR2(1000);
  l_sql_stmt VARCHAR2(1000);
  l_try NUMBER;
  l_status NUMBER;
BEGIN
 
  -- Create the TASK
  DBMS_PARALLEL_EXECUTE.CREATE_TASK ('mytask');
 
  -- Chunk the table by MANAGER_ID
  l_chunk_sql := 'SELECT distinct manager_id, manager_id FROM employees';
  DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_SQL('mytask', l_chunk_sql, false);
 
  -- Execute the DML in parallel
  --   the WHERE clause contain a condition on manager_id, which is the chunk
  --   column. In this case, grouping rows is by manager_id.
  l_sql_stmt := 'update EMPLOYEES e 
      SET e.salary = e.salary + 10
      WHERE manager_id between :start_id and :end_id';
  DBMS_PARALLEL_EXECUTE.RUN_TASK('mytask', l_sql_stmt, DBMS_SQL.NATIVE,
                                  parallel_level => 10);
 
  -- If there is error, RESUME it for at most 2 times.
  L_try := 0;
  L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('mytask');
  WHILE(l_try < 2 and L_status != DBMS_PARALLEL_EXECUTE.FINISHED) 
  Loop
    L_try := l_try + 1;
    DBMS_PARALLEL_EXECUTE.RESUME_TASK('mytask');
    L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('mytask');
  END LOOP;
 
  -- Done with processing; drop the task
  DBMS_PARALLEL_EXECUTE.DROP_TASK('mytask');
 
end;
/

ユーザー定義フレームワークでのチャンクの実行

チャンクは、RUN_TASKプロシージャを使用せずに、独自に定義したフレームワークで実行できます。次の例は、GET_ROWID_CHUNKプロシージャEXECUTE IMMEDIATESET_CHUNK_STATUSプロシージャを使用してチャンクを実行する方法を示しています。

DECLARE
  l_sql_stmt varchar2(1000);
  l_try number;
  l_status number;
  l_chunk_id number;
  l_start_rowid rowid;
  l_end_rowid rowid;
  l_any_rows boolean;
  CURSOR c1 IS SELECT chunk_id
               FROM user_parallel_execute_chunks
               WHERE task_name = 'mytask'
                 AND STATUS IN (DBMS_PARALLEL_EXECUTE.PROCESSED_WITH_ERROR,
                                DBMS_PARALLEL_EXECUTE.ASSIGNED);
BEGIN
 
  -- Create the Objects, task, and chunk by ROWID
  DBMS_PARALLEL_EXECUTE.CREATE_TASK ('mytask');
  DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID('mytask', 'HR', 'EMPLOYEES', true, 100);
 
  l_sql_stmt := 'update EMPLOYEES e 
      SET e.salary = e.salary + 10
      WHERE rowid BETWEEN :start_id AND :end_id';
 
  -- Execute the DML in his own framework 
  --
  -- Process each chunk and commit.
  -- After processing one chunk, repeat this process until
  -- all the chunks are processed.
  --
  <<main_processing>>
  LOOP
      --
      -- Get a chunk to process; if there is nothing to process, then exit the 
      -- loop;
      --
      DBMS_PARALLEL_EXECUTE.GET_ROWID_CHUNK('mytask',
                                                          l_chunk_id,
                                                          l_start_rowid,
                                                          l_end_rowid,
                                                          l_any_rows);
      IF (l_any_rows = false) THEN EXIT; END IF;
 
      --
      -- The chunk is specified by start_id and end_id.
      -- Bind the start_id and end_id and then execute it
      --
      -- If no error occured, set the chunk status to PROCESSED.
      --
      -- Catch any exception. If an exception occured, store the error num/msg
      -- into the chunk table and then continue to process the next chunk.
      -- 
      BEGIN
        EXECUTE IMMEDIATE l_sql_stmt using l_start_rowid, l_end_rowid;
        DBMS_PARALLEL_EXECUTE.SET_CHUNK_STATUS('mytask',l_chunk_id,
          DBMS_PARALLEL_EXECUTE.PROCESSED);
      EXCEPTION WHEN OTHERS THEN
        DBMS_PARALLEL_EXECUTE.SET_CHUNK_STATUS('mytask', l_chunk_id,
          DBMS_PARALLEL_EXECUTE.PROCESSED_WITH_ERROR, SQLCODE, SQLERRM);
      END;
 
      --
      -- Finished processing one chunk; Commit here
      --
      COMMIT;
  END LOOP;

130.7 DBMS_PARALLEL_EXECUTEサブプログラムの要約

この表は、DBMS_PARALLEL_EXECUTEサブプログラムを示し、簡単に説明しています。

表130-4 DBMS_PARALLEL_EXECUTEパッケージのサブプログラム

サブプログラム 説明

ADM_DROP_CHUNKSプロシージャ

指定した所有者が所有している指定のタスクのすべてのチャンクを削除します。

ADM_DROP_TASKプロシージャ

指定したユーザーのタスクとすべての関連したチャンクを削除します。

ADM_TASK_STATUSファンクション

タスク・ステータスを戻します。

ADM_STOP_TASKプロシージャ

指定の所有者のタスクおよび関連するジョブ・セカンダリ・プロセスを停止します

CREATE_TASKプロシージャ

現行のユーザーのタスクを作成します。

CREATE_CHUNKS_BY_NUMBER_COLプロシージャ

指定した列ごとに、指定したタスクに関連付けられている表をチャンクします

CREATE_CHUNKS_BY_ROWIDプロシージャ

ROWIDごとに、指定したタスクに関連付けられている表をチャンクします。

CREATE_CHUNKS_BY_SQLプロシージャ

ユーザー指定のSELECT文によって、指定したタスクに関連付けられている表をチャンクします。

DROP_TASKプロシージャ

タスクとすべての関連したチャンクを削除します。

DROP_CHUNKSプロシージャ

タスクのチャンクを削除します。

GENERATE_TASK_NAMEファンクション

タスクの一意の名前を戻します。

GET_NUMBER_COL_CHUNKプロシージャ

割り当てられていないNUMBERチャンクを取得し、ASSIGNEDに変更します。

GET_ROWID_CHUNKプロシージャ

割り当てられていないROWIDチャンクを取得し、ASSIGNEDに変更します。

PURGE_PROCESSED_CHUNKSプロシージャ

ステータスがPROCESSEDまたはPROCESSED_WITH_ERRORのすべての処理済チャンクを削除します。

RESUME_TASKプロシージャ

RUN_TASKプロシージャがエラーで終了した場合に指定したタスクを再試行するか、またはクラッシュが発生した場合にタスクを再開します。

RUN_TASKプロシージャ

指定したSQL文をチャンクに対してパラレル実行します。

SET_CHUNK_STATUSプロシージャ

チャンクのステータスを設定します。

STOP_TASKプロシージャ

タスクおよび関連するジョブのセカンダリ・プロセスを停止します

TASK_STATUSプロシージャ

タスク・ステータスを戻します。

130.7.1 ADM_DROP_CHUNKSプロシージャ

このプロシージャは、指定した所有者が所有している指定のタスクのすべてのチャンクを削除します。

構文

DBMS_PARALLEL_EXECUTE.ADM_DROP_CHUNKS (
   task_owner      IN  VARCHAR2,
   task_name       IN  VARCHAR2);

パラメータ

表130-5 ADM_DROP_CHUNKSプロシージャのパラメータ

パラメータ 説明

task_owner

タスクの所有者

task_name

タスク名

130.7.2 ADM_DROP_TASKプロシージャ

このプロシージャは、指定したユーザーのタスクとすべての関連したチャンクを削除します。

構文

DBMS_PARALLEL_EXECUTE.ADM_DROP_TASK (
   task_owner      IN  VARCHAR2,
   task_name       IN  VARCHAR2);

パラメータ

表130-6 ADM_DROP_TASKプロシージャのパラメータ

パラメータ 説明

task_owner

タスクの所有者

task_name

タスク名

130.7.3 ADM_TASK_STATUSファンクション

このファンクションは、タスク・ステータスを戻します。

構文

DBMS_PARALLEL_EXECUTE.ADM_TASK_STATUS  (
   task_owner      IN  VARCHAR2,
   task_name       IN  VARCHAR2)
 RETURN NUMBER;

パラメータ

表130-7 ADM_TASK_STATUSファンクションのパラメータ

パラメータ 説明

task_owner

タスクの所有者

task_name

タスク名

130.7.4 ADM_STOP_TASKプロシージャ

このプロシージャは、指定した所有者のタスクおよび関連するジョブ・セカンダリ・プロセスを停止します。

構文

DBMS_PARALLEL_EXECUTE.ADM_STOP_TASK (
   task_owner      IN  VARCHAR2,
   task_name       IN  VARCHAR2);

パラメータ

表130-8 ADM_STOP_TASKプロシージャのパラメータ

パラメータ 説明

task_owner

タスクの所有者

task_name

タスク名

130.7.5 CREATE_TASKプロシージャ

このプロシージャは、現行のユーザーのタスクを作成します。task_namecurrent_userのペアは一意である必要があります。

構文

DBMS_PARALLEL_EXECUTE.CREATE_TASK (
   task_name        IN   VARCHAR2,
   comment          IN   VARCHAR2 DEFAULT NULL);

パラメータ

表130-9 CREATE_TASKプロシージャのパラメータ

パラメータ 説明

task_name

タスクの名前。task_nameには、関連した長さが128バイト以下の任意の文字列を指定できます。

comment

コメント・フィールド。コメントは4000バイト未満である必要があります。

130.7.6 CREATE_CHUNKS_BY_NUMBER_COLプロシージャ

このプロシージャは、指定した列ごとに、(指定したタスクに関連付けられている)表をチャンクします。指定する列はNUMBER列である必要があります。このプロシージャは、列のMIN値とMAX値を取得し、chunk_sizeに応じてその範囲を均等に分割します。

チャンクは次のとおりです。

START_ID                              END_ID
---------------------------           ---------------------------
min_id_val                            min_id_val+1*chunk_size-1
min_id_val+1*chunk_size               min_id_val+2*chunk_size-1
…                                     …
min_id_val+i*chunk_size               max_id_val

構文

DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_NUMBER_COL (
   task_name       IN  VARCHAR2,
   table_owner     IN  VARCHAR2,
   table_name      IN  VARCHAR2,
   table_column    IN  VARCHAR2,
   chunk_size      IN  NUMBER);

パラメータ

表130-10 CREATE_CHUNKS_BY_NUMBER_COLプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

table_owner

表の所有者

table_name

表の名前

table_column

NUMBER列の名前。

chunk_size

各チャンクの範囲。

130.7.7 CREATE_CHUNKS_BY_ROWIDプロシージャ

このプロシージャは、ROWIDごとに、(指定したタスクに関連付けられている)表をチャンクします。

num_rowおよびnum_blockは、各チャンクのサイズをおおまかに示すものです。チャンクされる表は、ビューおよび表ファンクションを含む物理ROWIDのある物理表である必要があります。索引構成表は使用できません。

構文

DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_ROWID (
   task_name       IN  VARCHAR2,
   table_owner     IN  VARCHAR2,
   table_name      IN  VARCHAR2,
   by_row          IN  BOOLEAN,
   chunk_size      IN  NUMBER);

パラメータ

表130-11 CREATE_CHUNKS_BY_ROWIDプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

table_owner

表の所有者

table_name

表の名前

by_row

chunk_sizeが行数を示す場合はTRUEを指定します。それ以外の場合、chunk_sizeはブロック数を示します。

chunk_size

各コミット・サイクルで処理する行またはブロックの概数。

130.7.8 CREATE_CHUNKS_BY_SQLプロシージャ

このプロシージャは、ユーザー指定のSELECT文によって、(指定したタスクに関連付けられている)表をチャンクします。

各チャンクの範囲を戻すSELECT文には、start_idend_idの2つの列が含まれている必要があります。タスクがROWIDごとにチャンクされる場合、これらの2つの列はROWIDタイプである必要があります。タスクがNUMBER列ごとにチャンクされる場合、これらの2つの列はNUMBERタイプである必要があります。このプロシージャによって、ユーザーは、ユーザー定義のチャンク・アルゴリズムを柔軟にデプロイできるようになります。

構文

DBMS_PARALLEL_EXECUTE.CREATE_CHUNKS_BY_SQL (
   task_name       IN  VARCHAR2,
   sql_stmt        IN  CLOB,
   by_rowid        IN  BOOLEAN);

パラメータ

表130-12 CREATE_CHUNKS_BY_SQLプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

sql_stmt

チャンクの範囲を戻すSQL。

by_rowid

表をROWIDごとにチャンクする場合はTRUEを指定します。

130.7.9 DROP_TASKプロシージャ

このプロシージャは、タスクとすべての関連したチャンクを削除します。

構文

DBMS_PARALLEL_EXECUTE.DROP_TASK (
   task_name       IN VARCHAR2);

パラメータ

表130-13 DROP_TASKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

130.7.10 DROP_CHUNKSプロシージャ

このプロシージャは、タスクのチャンクを削除します。

構文

DBMS_PARALLEL_EXECUTE.DROP_CHUNKS (
   task_name       IN VARCHAR2);

パラメータ

表130-14 DROP_CHUNKSプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

130.7.11 GENERATE_TASK_NAMEファンクション

このファンクションは、タスクの一意の名前を戻します。

名前はprefixNの形式で示され、Nは順序番号です。接頭辞が指定されていない場合にデフォルトで生成される名前はTASK$_1TASK$_2TASK$_3などになります。接頭辞として'SCOTT'が指定されている場合の名前は、SCOTT1SCOTT2などになります。

構文

DBMS_PARALLEL_EXECUTE.GENERATE_TASK_NAME (
   prefix      IN      VARCHAR2 DEFAULT 'TASK$_') 
 RETURN VARCHAR2;

パラメータ

表130-15 GENERATE_TASK_NAMEファンクションのパラメータ

パラメータ 説明

prefix

タスク名の作成時に使用する接頭辞。

130.7.12 GET_NUMBER_COL_CHUNKプロシージャ

このプロシージャは、割り当てられていないNUMBERチャンクを取得し、ASSIGNEDに変更します。割り当てるチャンクがない場合、any_rowsFALSEに設定されます。それ以外の場合、チャンクのchunk_idstartおよびend_idは、OUTパラメータとして戻されます。

DBMS_PARALLEL_EXECUTE_CHUNKS$内のチャンク情報が次のように更新され、STATUSASSIGNEDとなり、START_TIMESTAMPには現在の時間が記録され、END_TIMESTAMPはクリアされます。

参照:

ビュー

構文

DBMS_PARALLEL_EXECUTE.GET_NUMBER_COL_CHUNK (
   task_name       IN VARCHAR2,
   chunk_id        OUT NUMBER,
   start_id        OUT NUMBER,      
   end_id          OUT NUMBER,
   any_rows        OUT BOOLEAN);

パラメータ

表130-16 GET_NUMBER_COL_CHUNKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

chunk_id

チャンクのチャンクID

start_id

戻された範囲内の開始行のID

end_id

戻された範囲内の終了行のID

any_rows

範囲内に処理対象の行があるかどうかを示します

使用上のノート

タスクがROWIDごとにチャンクされる場合は、get_rowid_rangeを使用します。タスクがNUMBER列ごとにチャンクされる場合は、get_number_col_rangeを使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_idany_rowsの値は有効ですが、start_idend_idNULLとなります。

130.7.13 GET_ROWID_CHUNKプロシージャ

このプロシージャは、割り当てられていないROWIDチャンクを取得し、ASSIGNEDに変更します。

割り当てるチャンクがない場合、any_rowsFALSEに設定されます。それ以外の場合、チャンクのchunk_idstartおよびend_rowidは、OUTパラメータとして戻されます。DBMS_PARALLEL_EXECUTE_CHUNKS$内のチャンク情報が次のように更新され、STATUSASSIGNEDとなり、START_TIMESTAMPには現在の時間が記録され、END_TIMESTAMPはクリアされます。

参照:

ビュー

構文

DBMS_PARALLEL_EXECUTE.GET_ROWID_CHUNK (
   task_name       IN VARCHAR2,
   chunk_id        OUT NUMBER,
   start_rowid     OUT ROWID,      
   end_rowid       OUT ROWID,
   any_rows        OUT BOOLEAN);

パラメータ

表130-17 GET_ROWID_CHUNKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

chunk_id

チャンクのチャンクID

start_rowid

戻された範囲の開始ROWID。

end_rowid

戻された範囲の終了ROWID。

any_rows

処理する行が範囲に含まれる可能性があることを示します。

使用上のノート

タスクがROWIDごとにチャンクされる場合は、get_rowid_rangeを使用します。タスクがNUMBER列ごとにチャンクされる場合は、get_number_col_rangeを使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_idany_rowsの値は有効なままですが、start_idend_idNULLとなります。

130.7.14 PURGE_PROCESSED_CHUNKSプロシージャ

このプロシージャは、ステータスがPROCESSEDまたはPROCESSED_WITH_ERRORのすべての処理済チャンクを削除します。

構文

DBMS_PARALLEL_EXECUTE.PURGE_PROCESSED_CHUNKS (
   task_name       IN VARCHAR2);

パラメータ

表130-18 PURGE_PROCESSED_CHUNKSプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

130.7.15 RESUME_TASKプロシージャ

このプロシージャは、RUN_TASKプロシージャがエラーで終了した場合は指定されたタスクを再試行し、クラッシュが発生した場合はタスクを再開します。

タスクがCRASHEDまたはFINISHED_WITH_ERRORの状態の場合にのみ、このプロシージャを起動できます。

クラッシュしたシリアル実行の場合、状態はPROCESSINGのままになります。FORCEオプションを使用すると、PROCESSING状態の任意のタスクを再開できます。ただし、クラッシュが発生したかどうかの確認は、各自で行います。

このプロシージャによって、処理されていないチャンクの処理が再開されます。また、PROCESSED_WITH_ERRORまたはASSIGNED(クラッシュが原因)状態のチャンクは、コミットしなかったため処理されます。

このプロシージャは、RUN_TASKプロシージャと同じ引数を使用します。task_nameを唯一の入力引数として使用するオーバーロードは、前のRUN_TASKプロシージャまたはRESUME_TASKプロシージャのコールで指定された引数を再利用します。

参照:

表130-2

構文

DBMS_PARALLEL_EXECUTE.RESUME_TASK (
   task_name                     IN  VARCHAR2,
   sql_stmt                      IN  CLOB,   
   language_flag                 IN  NUMBER,
   edition                       IN  VARCHAR2  DEFAULT NULL,
   apply_crossedition_trigger    IN  VARCHAR2  DEFAULT NULL,
   fire_apply_trigger            IN  BOOLEAN   DEFAULT TRUE,
   parallel_level                IN  NUMBER    DEFAULT 0,
   job_class                     IN  VARCHAR2  DEFAULT 'DEFAULT_JOB_CLASS',
   force                         IN  BOOLEAN   DEFAULT FALSE);

DBMS_PARALLEL_EXECUTE.RESUME_TASK (
   task_name                     IN  VARCHAR2,
   force                         IN  BOOLEAN   DEFAULT FALSE);

パラメータ

表130-19 RESUME_TASKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

sql_stmt

SQL文。:start_id:end_idのプレースホルダを含んでいる必要があります。

language_flag

OracleでSQL文を処理する方法を決定します。認識されるオプションは以下のとおりです。

  • V6(または0)は、バージョン6の動作を指定します。

  • NATIVE(または1)は、プログラムの接続先のデータベースに関する通常の動作を指定します。

  • V7(または2)は、Oracle Databaseバージョン7の動作を指定します。

edition

文を実行するエディションを指定します。デフォルトは現行のエディションです。

apply_crossedition_trigger

指定したSQLに適用する転送crosseditionトリガーの未修飾の名前を指定します。この名前は、文が実行されるエディションおよびcurrent_schema設定を使用して解決されます。トリガーは、文を実行するユーザーによって所有されている必要があります。

fire_apply_trigger

指定したapply_crossedition_triggerをそれ自体実行するか、他のトリガーを選択する場合のガイドとしてのみ使用するかを示します。

parallel_level

パラレル・ジョブの数を指定します。シリアル実行する場合はゼロを指定し、デフォルトの並列度を使用する場合はNULLを指定します。

job_class

パラレル実行の場合、ジョブはすべて指定したジョブ・クラスに属します。

force

TRUEに設定すると、ステータスがPROCESSINGの場合、エラーは発生しません。

チャンク表に次のチャンク範囲が含まれているとします。

START_ID                              END_ID
---------------------------           ---------------------------
1                                     10
11                                    20
21                                    30

指定したSQL文は、次のとおりです。

UPDATE employees
      SET salary = salary + 10
      WHERE e.employee_id  BETWEEN :start_id AND :end_id

このプロシージャは、次の文をパラレル実行します。

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id BETWEEN 1 and 10; 
      COMMIT;

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id between 11 and 20;
      COMMIT;

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id between 21 and 30;
      COMMIT;

130.7.16 RUN_TASKプロシージャ

このプロシージャは、指定した文(sql_stmt)をチャンクに対してパラレル実行します。

各チャンクの処理後に、コミットが行われます。

指定する文には、それぞれstart_idおよびend_idと呼ばれる2つのプレースホルダが必要で、これらは処理されるチャンクの範囲を表します。各プレースホルダのタイプは、ROWIDベースのチャンクを使用した場合はROWIDNUMBERベースのチャンクを使用した場合はNUMBERである必要があります。

構文

DBMS_PARALLEL_EXECUTE.RUN_TASK (
   task_name                     IN  VARCHAR2,
   sql_stmt                      IN  CLOB,
   language_flag                 IN  NUMBER,
   edition                       IN  VARCHAR2  DEFAULT NULL,
   apply_crossedition_trigger    IN  VARCHAR2  DEFAULT NULL,
   fire_apply_trigger            IN  BOOLEAN   DEFAULT TRUE,
   parallel_level                IN  NUMBER    DEFAULT 0,
   job_class                     IN  VARCHAR2  DEFAULT 'DEFAULT_JOB_CLASS');

パラメータ

表130-20 RUN_TASKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

sql_stmt

SQL文。:start_id:end_idのプレースホルダを含んでいる必要があります。

language_flag

OracleでSQL文を処理する方法を決定します。認識されるオプションは以下のとおりです。

  • V6(または0)は、バージョン6の動作を指定します。

  • NATIVE(または1)は、プログラムの接続先のデータベースに関する通常の動作を指定します。

  • V7(または2)は、Oracle Databaseバージョン7の動作を指定します。

edition

文を実行するエディションを指定します。デフォルトは現行のエディションです。

apply_crossedition_trigger

指定したSQLに適用する転送crosseditionトリガーの未修飾の名前を指定します。この名前は、文が実行されるエディションおよびcurrent_schema設定を使用して解決されます。トリガーは、文を実行するユーザーによって所有されている必要があります。

fire_apply_trigger

指定したapply_crossedition_triggerをそれ自体実行するか、他のトリガーを選択する場合のガイドとしてのみ使用するかを示します。

parallel_level

パラレル・ジョブの数を指定します。シリアル実行する場合はゼロを指定し、デフォルトの並列度を使用する場合はNULLを指定します。

job_class

パラレル実行の場合、ジョブは指定したジョブ・クラスに属します。

使用上のノート

  • SQL文は現行のユーザーとして実行されます。

  • このサブプログラムはエラー上で再実行されることがあるため、同等ではないRUN_TASKに文を送信する場合は細心の注意が必要です。

  • チャンクはDBMS_SCHEDULERジョブのセカンダリ・プロセスでパラレル実行できます。そのため、パラレル実行にはCREATE JOBシステム権限が必要です。ジョブ・セカンダリ・プロセスは、現在のユーザーに基づいて作成されます。ジョブ・セカンダリ・プロセスのデフォルト数は、Oracleのパラメータcpu_countおよびparallel_threads_per_cpuの積として計算されます。Real Application Clustersのインストールでは、ジョブ・セカンダリ・プロセスの数はクラスタ内の各ノードの個別の設定の合計になります。このプロシージャは、すべてのチャンクが処理されたときにのみ戻されます。パラレル実行の場合、このプロシージャはセカンダリ・プロセスがすべて完了したときにのみ復帰します。

チャンク表に次のチャンク範囲が含まれているとします。

START_ID                              END_ID
---------------------------           ---------------------------
1                                     10
11                                    20
21                                    30

指定したSQL文は、次のとおりです。

UPDATE employees
      SET salary = salary + 10
      WHERE e.employee_id  BETWEEN :start_id AND :end_id

このプロシージャは、次の文をパラレル実行します。

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id BETWEEN 1 and 10; 
      COMMIT;

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id between 11 and 20;
      COMMIT;

UPDATE employees  
      SET salary =.salary + 10  WHERE employee_id between 21 and 30;
      COMMIT;

130.7.17 SET_CHUNK_STATUSプロシージャ

このプロシージャは、チャンクのステータスを設定します。

チャンクのSTART_TIMESTAMPおよびEND_TIMESTAMPは、新しいステータスに応じて更新されます。

Value of the new Status               Side Effect
---------------------------           ---------------------------
UNASSIGNED                            START_TIMESTAMP and END_TIMESTAMP 
                                      will be cleared
ASSIGNED                              START_TIMESTAMP will be the current time 
                                      and END_TIMESTAMP will be cleared.
PROCESSED or PROCESSED_WITH_ERROR     The current time will be recorded 
                                      in END_TIMESTAMP

参照:

ビュー

構文

DBMS_PARALLEL_EXECUTE.SET_CHUNK_STATUS (
   task_name       IN VARCHAR2,
   chunk_id        OUT NUMBER,
   status          IN  NUMBER,
   err_num         IN  NUMBER   DEFAULT NULL,
   err_msg         IN  VARCHAR2 DEFAULT NULL);

パラメータ

表130-21 SET_CHUNK_STATUSプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

chunk_id

チャンクのchunk_id。

status

チャンクのステータス: UNASSIGNEDASSIGNEDPROCESSEDPROCESSED_WITH_ERROR

err_num

チャンクの処理中に戻されたエラー・コード

err_msg

チャンクの処理中に戻されたエラー・メッセージ

130.7.18 STOP_TASKプロシージャ

このプロシージャは、タスクおよび関連するセカンダリ・プロセスを停止します。

構文

DBMS_PARALLEL_EXECUTE.STOP_TASK (
   task_name       IN VARCHAR2);

パラメータ

表130-22 STOP_TASKプロシージャのパラメータ

パラメータ 説明

task_name

タスク名

130.7.19 TASK_STATUSプロシージャ

このプロシージャは、タスク・ステータスを戻します。

構文

DBMS_PARALLEL_EXECUTE.TASK_STATUS (
   task_name       IN VARCHAR2);

パラメータ

表130-23 TASK_STATUSプロシージャのパラメータ

パラメータ 説明

task_name

タスク名