130 DBMS_PARALLEL_EXECUTE
DBMS_PARALLEL_EXECUTE
パッケージを使用すると、表データをパラレルで増分更新できるようになります。
130.1 DBMS_PARALLEL_EXECUTEの概要
このパッケージを使用すると、次の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_SQL
、RUN_TASK
、RESUME_TASK
サブプログラムは問合せを要求し、DBMS_SQL
を使用して実行します。DBMS_SQL
インタフェースの実行者は、問合せがSQLインジェクションを含んでいないことを確認する必要があります。
130.3 DBMS_PARALLEL_EXECUTEの定数
DBMS_PARALLEL_EXECUTE
パッケージでは、次の2つの表に示す定数が使用されます。
表130-1 DBMS_PARALLEL_EXECUTEの定数 - チャンク・ステータス値
定数 | タイプ | 値 | 説明 |
---|---|---|---|
|
|
1 |
チャンクが処理の対象として割り当てられています。 |
|
|
2 |
チャンクが正常に処理されました。 |
|
|
3 |
チャンクは処理されましたが、処理中にエラーが発生しました。 |
|
|
0 |
チャンクが割り当てられていません |
表130-2 DBMS_PARALLEL_EXECUTEの定数 - タスク・ステータス値
定数 | タイプ | 値 | 説明 |
---|---|---|---|
|
|
5 |
タスクに関連付けられている表はチャンクされていますが、どのチャンクも処理の対象として割り当てられていません。 |
|
|
2 |
タスクに割り当てられている表がチャンクされています。 |
|
|
3 |
チャンクに失敗しました |
|
|
9 |
パラレル実行を使用する場合にのみ該当し、ジョブ・セカンダリ・プロセスがクラッシュしたか、データベースが |
|
|
1 |
タスクが |
|
|
7 |
すべてのチャンクがエラーなく処理されました。 |
|
|
8 |
すべてのチャンクが処理されましたが、エラーが発生した場合もあります。 |
NO_CHUNKS |
NUMBER |
4 |
タスクに関連付けられた表にチャンクが作成されていません |
|
|
6 |
一部のチャンクが処理の対象として割り当てられているか、または処理されています。 |
ノート:
絶対値は将来変更される可能性があるため、かわりに定数を使用します。130.5 DBMS_PARALLEL_EXECUTEの例外
次の表に、DBMS_PARALLEL_EXECUTE
で発生する例外を示します。
表130-3 DBMS_PARALLEL_EXECUTEで発生する例外
例外 | エラー・コード | 説明 |
---|---|---|
|
29499 |
指定されたチャンクが存在しません。 |
|
29497 |
同じタスク名が既存のタスクによって使用されています。 |
|
29492 |
|
|
29495 |
実行の再開を試行しますが、タスクが |
|
29494 |
|
|
29493 |
チャンク・ステータスへの無効な値の設定を試行します。 |
|
29491 |
表が物理表ではないか、またはIOTの場合に、ROWIDごとに表のチャンクを試行します。 |
|
29490 |
ユーザーには、必要な |
|
29498 |
指定された |
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
IMMEDIATE
、SET_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パッケージのサブプログラム
サブプログラム | 説明 |
---|---|
指定した所有者が所有している指定のタスクのすべてのチャンクを削除します。 |
|
指定したユーザーのタスクとすべての関連したチャンクを削除します。 |
|
タスク・ステータスを戻します。 |
|
指定の所有者のタスクおよび関連するジョブ・セカンダリ・プロセスを停止します |
|
現行のユーザーのタスクを作成します。 |
|
指定した列ごとに、指定したタスクに関連付けられている表をチャンクします |
|
|
|
ユーザー指定の |
|
タスクとすべての関連したチャンクを削除します。 |
|
タスクのチャンクを削除します。 |
|
タスクの一意の名前を戻します。 |
|
割り当てられていない |
|
割り当てられていない |
|
ステータスが |
|
RUN_TASKプロシージャがエラーで終了した場合に指定したタスクを再試行するか、またはクラッシュが発生した場合にタスクを再開します。 |
|
指定したSQL文をチャンクに対してパラレル実行します。 |
|
チャンクのステータスを設定します。 |
|
タスクおよび関連するジョブのセカンダリ・プロセスを停止します |
|
タスク・ステータスを戻します。 |
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスクの所有者 |
|
タスク名 |
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスクの所有者 |
|
タスク名 |
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ファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
タスクの所有者 |
|
タスク名 |
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスクの所有者 |
|
タスク名 |
130.7.5 CREATE_TASKプロシージャ
このプロシージャは、現行のユーザーのタスクを作成します。task_name
とcurrent_user
のペアは一意である必要があります。
構文
DBMS_PARALLEL_EXECUTE.CREATE_TASK ( task_name IN VARCHAR2, comment IN VARCHAR2 DEFAULT NULL);
パラメータ
表130-9 CREATE_TASKプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスクの名前。task_nameには、関連した長さが128バイト以下の任意の文字列を指定できます。 |
|
コメント・フィールド。コメントは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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
表の所有者 |
|
表の名前 |
|
|
|
各チャンクの範囲。 |
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
表の所有者 |
|
表の名前 |
|
|
|
各コミット・サイクルで処理する行またはブロックの概数。 |
130.7.8 CREATE_CHUNKS_BY_SQLプロシージャ
このプロシージャは、ユーザー指定のSELECT
文によって、(指定したタスクに関連付けられている)表をチャンクします。
各チャンクの範囲を戻すSELECT
文には、start_id
とend_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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
チャンクの範囲を戻すSQL。 |
|
表をROWIDごとにチャンクする場合は |
130.7.9 DROP_TASKプロシージャ
このプロシージャは、タスクとすべての関連したチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.DROP_TASK ( task_name IN VARCHAR2);
パラメータ
表130-13 DROP_TASKプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
130.7.10 DROP_CHUNKSプロシージャ
このプロシージャは、タスクのチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.DROP_CHUNKS ( task_name IN VARCHAR2);
パラメータ
表130-14 DROP_CHUNKSプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
130.7.11 GENERATE_TASK_NAMEファンクション
このファンクションは、タスクの一意の名前を戻します。
名前はprefixNの形式で示され、Nは順序番号です。接頭辞が指定されていない場合にデフォルトで生成される名前はTASK$_1
、TASK$_2
、TASK$_3
などになります。接頭辞として'SCOTT
'が指定されている場合の名前は、SCOTT1
、SCOTT2
などになります。
構文
DBMS_PARALLEL_EXECUTE.GENERATE_TASK_NAME ( prefix IN VARCHAR2 DEFAULT 'TASK$_') RETURN VARCHAR2;
パラメータ
表130-15 GENERATE_TASK_NAMEファンクションのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名の作成時に使用する接頭辞。 |
130.7.12 GET_NUMBER_COL_CHUNKプロシージャ
このプロシージャは、割り当てられていないNUMBER
チャンクを取得し、ASSIGNED
に変更します。割り当てるチャンクがない場合、any_rows
はFALSE
に設定されます。それ以外の場合、チャンクのchunk_id
、start
およびend
_id
は、OUT
パラメータとして戻されます。
DBMS_PARALLEL_EXECUTE_CHUNKS$
内のチャンク情報が次のように更新され、STATUS
はASSIGNED
となり、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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
チャンクのチャンクID |
|
戻された範囲内の開始行のID |
|
戻された範囲内の終了行のID |
|
範囲内に処理対象の行があるかどうかを示します |
使用上のノート
タスクがROWID
ごとにチャンクされる場合は、get_rowid_range
を使用します。タスクがNUMBER
列ごとにチャンクされる場合は、get_number_col_range
を使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_id
とany_rows
の値は有効ですが、start_id
とend_id
はNULL
となります。
130.7.13 GET_ROWID_CHUNKプロシージャ
このプロシージャは、割り当てられていないROWID
チャンクを取得し、ASSIGNED
に変更します。
割り当てるチャンクがない場合、any_rows
はFALSE
に設定されます。それ以外の場合、チャンクのchunk_id
、start
およびend
_rowid
は、OUT
パラメータとして戻されます。DBMS_PARALLEL_EXECUTE_CHUNKS$
内のチャンク情報が次のように更新され、STATUS
はASSIGNED
となり、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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
チャンクのチャンクID |
|
戻された範囲の開始ROWID。 |
|
戻された範囲の終了ROWID。 |
|
処理する行が範囲に含まれる可能性があることを示します。 |
使用上のノート
タスクがROWID
ごとにチャンクされる場合は、get_rowid_range
を使用します。タスクがNUMBER
列ごとにチャンクされる場合は、get_number_col_range
を使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_id
とany_rows
の値は有効なままですが、start_id
とend_id
はNULL
となります。
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
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プロシージャのコールで指定された引数を再利用します。
参照:
構文
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
SQL文。 |
|
OracleでSQL文を処理する方法を決定します。認識されるオプションは以下のとおりです。
|
|
文を実行するエディションを指定します。デフォルトは現行のエディションです。 |
|
指定したSQLに適用する転送crosseditionトリガーの未修飾の名前を指定します。この名前は、文が実行されるエディションおよび |
|
指定した |
|
パラレル・ジョブの数を指定します。シリアル実行する場合はゼロを指定し、デフォルトの並列度を使用する場合は |
|
パラレル実行の場合、ジョブはすべて指定したジョブ・クラスに属します。 |
|
|
例
チャンク表に次のチャンク範囲が含まれているとします。
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
ベースのチャンクを使用した場合はROWID
、NUMBER
ベースのチャンクを使用した場合は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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
SQL文。 |
|
OracleでSQL文を処理する方法を決定します。認識されるオプションは以下のとおりです。
|
|
文を実行するエディションを指定します。デフォルトは現行のエディションです。 |
|
指定したSQLに適用する転送crosseditionトリガーの未修飾の名前を指定します。この名前は、文が実行されるエディションおよび |
|
指定した |
|
パラレル・ジョブの数を指定します。シリアル実行する場合はゼロを指定し、デフォルトの並列度を使用する場合は |
|
パラレル実行の場合、ジョブは指定したジョブ・クラスに属します。 |
使用上のノート
-
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プロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |
|
チャンクのchunk_id。 |
|
チャンクのステータス: |
|
チャンクの処理中に戻されたエラー・コード |
|
チャンクの処理中に戻されたエラー・メッセージ |
130.7.18 STOP_TASKプロシージャ
このプロシージャは、タスクおよび関連するセカンダリ・プロセスを停止します。
構文
DBMS_PARALLEL_EXECUTE.STOP_TASK ( task_name IN VARCHAR2);
パラメータ
表130-22 STOP_TASKプロシージャのパラメータ
パラメータ | 説明 |
---|---|
|
タスク名 |