113 DBMS_PARALLEL_EXECUTE
DBMS_PARALLEL_EXECUTEパッケージを使用すると、表データをパラレルで増分更新できるようになります。
113.1 DBMS_PARALLEL_EXECUTEの概要
このパッケージを使用すると、次の2つのステップで、表データをパラレルで増分更新できます。
-
表内の一連の行を、より小さいサイズのチャンクにグループ化します。
-
ユーザーが指定した文をこれらのチャンクに対してパラレルで実行し、各チャンクの処理の終了時にコミットします。
このパッケージでは、パラレル実行タスクという概念が導入されています。このタスクによって、PL/SQLブロックのパラレル実行(通常は表データの更新)に関連付けられている様々なステップがグループ分けされます。
すべてのパッケージのサブルーチン(GENERATE_TASK_NAMEファンクションとTASK_STATUSプロシージャを除く)はコミットを実行します。
113.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インジェクションを含んでいないことを確認する必要があります。
113.3 DBMS_PARALLEL_EXECUTEの定数
DBMS_PARALLEL_EXECUTEパッケージでは、次の2つの表に示す定数が使用されます。
表113-1 DBMS_PARALLEL_EXECUTEの定数 - チャンク・ステータス値
| 定数 | タイプ | 値 | 説明 |
|---|---|---|---|
|
|
|
1 |
チャンクが処理の対象として割り当てられています。 |
|
|
|
2 |
チャンクが正常に処理されました。 |
|
|
|
3 |
チャンクは処理されましたが、処理中にエラーが発生しました。 |
|
|
|
0 |
チャンクが割り当てられていません |
表113-2 DBMS_PARALLEL_EXECUTEの定数 - タスク・ステータス値
| 定数 | タイプ | 値 | 説明 |
|---|---|---|---|
|
|
|
4 |
タスクに関連付けられている表はチャンクされていますが、どのチャンクも処理の対象として割り当てられていません。 |
|
|
|
2 |
タスクに割り当てられている表がチャンクされています。 |
|
|
|
3 |
チャンクに失敗しました |
|
|
|
8 |
パラレル実行を使用する場合にのみ該当し、ジョブ・スレーブがクラッシュしたか、またはデータベースが |
|
|
|
1 |
タスクが |
|
|
|
6 |
すべてのチャンクがエラーなく処理されました。 |
|
|
|
7 |
すべてのチャンクが処理されましたが、エラーが発生した場合もあります。 |
|
|
|
5 |
一部のチャンクが処理の対象として割り当てられているか、または処理されています。 |
113.5 DBMS_PARALLEL_EXECUTEの例外
次の表に、DBMS_PARALLEL_EXECUTEで発生する例外を示します。
表113-3 DBMS_PARALLEL_EXECUTEで発生する例外
| 例外 | エラー・コード | 説明 |
|---|---|---|
|
|
29499 |
指定されたチャンクが存在しません。 |
|
|
29497 |
同じタスク名が既存のタスクによって使用されています。 |
|
|
29492 |
|
|
|
29495 |
実行の再開を試行しますが、タスクが |
|
|
29494 |
|
|
|
29493 |
チャンク・ステータスへの無効な値の設定を試行します。 |
|
|
29491 |
表が物理表ではないか、またはIOTの場合に、ROWIDごとに表のチャンクを試行します。 |
|
|
29490 |
ユーザーには、必要な |
|
|
29498 |
指定された |
113.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;113.7 DBMS_PARALLEL_EXECUTEサブプログラムの要約
この表は、DBMS_PARALLEL_EXECUTEサブプログラムを示し、簡単に説明しています。
表113-4 DBMS_PARALLEL_EXECUTEパッケージのサブプログラム
| サブプログラム | 説明 |
|---|---|
|
指定した所有者が所有している指定のタスクのすべてのチャンクを削除します。 |
|
|
指定したユーザーのタスクとすべての関連したチャンクを削除します。 |
|
|
タスク・ステータスを戻します。 |
|
|
指定した所有者のタスクと関連したジョブ・スレーブを停止します。 |
|
|
現行のユーザーのタスクを作成します。 |
|
|
指定した列ごとに、指定したタスクに関連付けられている表をチャンクします。 |
|
|
|
|
|
ユーザー指定の |
|
|
タスクとすべての関連したチャンクを削除します。 |
|
|
タスクのチャンクを削除します。 |
|
|
タスクの一意の名前を戻します。 |
|
|
割り当てられていない |
|
|
割り当てられていない |
|
|
ステータスが |
|
|
RUN_TASKプロシージャがエラーで終了した場合に指定したタスクを再試行するか、またはクラッシュが発生した場合にタスクを再開します。 |
|
|
指定したSQL文をチャンクに対してパラレル実行します。 |
|
|
チャンクのステータスを設定します。 |
|
|
タスクと関連したジョブ・スレーブを停止します。 |
|
|
タスク・ステータスを戻します。 |
113.7.1 ADM_DROP_CHUNKSプロシージャ
このプロシージャは、指定した所有者が所有している指定のタスクのすべてのチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.ADM_DROP_CHUNKS ( task_owner IN VARCHAR2, task_name IN VARCHAR2);
パラメータ
表113-5 ADM_DROP_CHUNKSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスクの所有者 |
|
|
タスク名 |
113.7.2 ADM_DROP_TASKプロシージャ
このプロシージャは、指定したユーザーのタスクとすべての関連したチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.ADM_DROP_TASK ( task_owner IN VARCHAR2, task_name IN VARCHAR2);
パラメータ
表113-6 ADM_DROP_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスクの所有者 |
|
|
タスク名 |
113.7.3 ADM_TASK_STATUSファンクション
このファンクションは、タスク・ステータスを戻します。
構文
DBMS_PARALLEL_EXECUTE.ADM_TASK_STATUS ( task_owner IN VARCHAR2, task_name IN VARCHAR2) RETURN NUMBER;
パラメータ
表113-7 ADM_TASK_STATUSファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスクの所有者 |
|
|
タスク名 |
113.7.4 ADM_STOP_TASKプロシージャ
このプロシージャは、指定した所有者のタスクと関連したジョブ・スレーブを停止します。
構文
DBMS_PARALLEL_EXECUTE.ADM_STOP_TASK ( task_owner IN VARCHAR2, task_name IN VARCHAR2);
パラメータ
表113-8 ADM_STOP_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスクの所有者 |
|
|
タスク名 |
113.7.5 CREATE_TASKプロシージャ
このプロシージャは、現行のユーザーのタスクを作成します。task_nameとcurrent_userのペアは一意である必要があります。
構文
DBMS_PARALLEL_EXECUTE.CREATE_TASK ( task_name IN VARCHAR2, comment IN VARCHAR2 DEFAULT NULL);
パラメータ
表113-9 CREATE_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスクの名前。task_nameには、関連した長さが128バイト以下の任意の文字列を指定できます。 |
|
|
コメント・フィールド。コメントは4000バイト未満である必要があります。 |
113.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);
パラメータ
表113-10 CREATE_CHUNKS_BY_NUMBER_COLプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
表の所有者 |
|
|
表の名前 |
|
|
|
|
|
各チャンクの範囲。 |
113.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);
パラメータ
表113-11 CREATE_CHUNKS_BY_ROWIDプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
表の所有者 |
|
|
表の名前 |
|
|
|
|
|
各コミット・サイクルで処理する行またはブロックの概数。 |
113.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_statement IN CLOB, by_rowid IN BOOLEAN);
パラメータ
表113-12 CREATE_CHUNKS_BY_SQLプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
チャンクの範囲を戻すSQL。 |
|
|
表をROWIDごとにチャンクする場合は |
113.7.9 DROP_TASKプロシージャ
このプロシージャは、タスクとすべての関連したチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.DROP_TASK ( task_name IN VARCHAR2);
パラメータ
表113-13 DROP_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
113.7.10 DROP_CHUNKSプロシージャ
このプロシージャは、タスクのチャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.DROP_CHUNKS ( task_name IN VARCHAR2);
パラメータ
表113-14 DROP_CHUNKSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
113.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;
パラメータ
表113-15 GENERATE_TASK_NAMEファンクションのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名の作成時に使用する接頭辞。 |
113.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_rowid OUT ROWID, end_id OUT ROWID, any_rows OUT BOOLEAN);
パラメータ
表113-16 GET_NUMBER_COL_CHUNKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
チャンクのchunk_id。 |
|
|
戻された範囲の開始ROWID。 |
|
|
戻された範囲の終了ROWID。 |
|
|
範囲内に処理対象の行があるかどうかを示します。 |
使用上のノート
タスクがROWIDごとにチャンクされる場合は、get_rowid_rangeを使用します。タスクがNUMBER列ごとにチャンクされる場合は、get_number_col_rangeを使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_idとany_rowsの値は有効ですが、start_idとend_idはNULLとなります。
113.7.13 GET_ROWID_CHUNKプロシージャ
このプロシージャは、割り当てられていないROWIDチャンクを取得し、ASSIGNEDに変更します。
割り当てるチャンクがない場合、any_rowsはFALSEに設定されます。それ以外の場合、チャンクのchunk_id、startおよびend_idは、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_id OUT ROWID, any_rows OUT BOOLEAN);
パラメータ
表113-17 GET_ROWID_CHUNKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
チャンクのchunk_id。 |
|
|
戻された範囲の開始ROWID。 |
|
|
戻された範囲の終了ROWID。 |
|
|
処理する行が範囲に含まれる可能性があることを示します。 |
使用上のノート
タスクがROWIDごとにチャンクされる場合は、get_rowid_rangeを使用します。タスクがNUMBER列ごとにチャンクされる場合は、get_number_col_rangeを使用します。ユーザーが不適切なファンクション・コールを行った場合、戻されるchunk_idとany_rowsの値は有効なままですが、start_idとend_idはNULLとなります。
113.7.14 PURGE_PROCESSED_CHUNKSプロシージャ
このプロシージャは、ステータスがPROCESSEDまたはPROCESSED_WITH_ERRORのすべての処理済チャンクを削除します。
構文
DBMS_PARALLEL_EXECUTE.PURGE_PROCESSED_CHUNKS ( task_name IN VARCHAR2);
パラメータ
表113-18 PURGE_PROCESSED_CHUNKSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
113.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);
パラメータ
表113-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;関連項目
113.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');
パラメータ
表113-20 RUN_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
SQL文。 |
|
|
OracleでSQL文を処理する方法を決定します。認識されるオプションは以下のとおりです。
|
|
|
文を実行するエディションを指定します。デフォルトは現行のエディションです。 |
|
|
指定したSQLに適用する転送crosseditionトリガーの未修飾の名前を指定します。この名前は、文が実行されるエディションおよび |
|
|
指定した |
|
|
パラレル・ジョブの数を指定します。シリアル実行する場合はゼロを指定し、デフォルトの並列度を使用する場合は |
|
|
パラレル実行の場合、ジョブは指定したジョブ・クラスに属します。 |
使用上のノート
-
SQL文は現行のユーザーとして実行されます。
-
このサブプログラムはエラー上で再実行されることがあるため、同等ではない
RUN_TASKに文を送信する場合は細心の注意が必要です。 -
チャンクは
DBMS_SCHEDULERジョブ・スレーブによってパラレル実行できます。したがって、パラレル実行にはCREATEJOBシステム権限が必要です。ジョブ・スレーブは現行のユーザーに基づいて作成されます。ジョブ・スレーブのデフォルト数は、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;113.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);
パラメータ
表113-21 SET_CHUNK_STATUSプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |
|
|
チャンクのchunk_id。 |
|
|
チャンクのステータス: |
|
|
チャンクの処理中に戻されたエラー・コード |
|
|
チャンクの処理中に戻されたエラー・メッセージ |
113.7.18 STOP_TASKプロシージャ
このプロシージャは、タスクと関連したジョブ・スレーブを停止します。
構文
DBMS_PARALLEL_EXECUTE.STOP_TASK ( task_name IN VARCHAR2);
パラメータ
表113-22 STOP_TASKプロシージャのパラメータ
| パラメータ | 説明 |
|---|---|
|
|
タスク名 |