2016-09-15 62 views
1

基本的に私はファイルを処理し、複数のテーブルに情報を検証して挿入するOracle 11gのパッケージを持っています。これを達成するために を実装しました。ファイルを読み込んで情報を拡散し、複数のストアドプロシージャ 各テーブルのデータを検証して挿入する(テーブルごとに1つのプロシージャ)最後に共通のエラーテーブルにレコードを挿入するエラーについて エラーがあるかどうかを示す最後のストアドプロシージャを1つ呼び出しますこれらのエラーを含むファイルを生成します。パラレル実行oracle PL/SQL

今は...実行時間を最小限に抑えるためにコードを改善しようとしていますが、 の情報を検証して挿入する各SPは他のSP情報に依存しないことを認識していますこのSPをすべて並列に呼び出す方法があるかどうかを尋ねます。私はあなたがRUN_JOBを使用するか、提出することができます

STORED PROCEDURE charge_file 
STORED PROCEDURE insert_table1 - STORED PROCEDURE insert_table2 - STORED PROCEDURE insert_table3 ... 
STORED PROCEDURE return_file 

答えて

2

使用parallel_execute:

create table proc_map (proc_id number, proc_name varchar2(64), is_active varchar2(1)); 

insert into proc_map (proc_id, proc_name, is_active) values (1, 'insert_table1', 'Y'); 
insert into proc_map (proc_id, proc_name, is_active) values (2, 'insert_table2', 'Y'); 
insert into proc_map (proc_id, proc_name, is_active) values (3, 'insert_table3', 'Y'); 


create or replace procedure p_run_proc (ip_start in number, ip_end in number) is 
    v_proc_name proc_map.proc_name%type; 
begin 
    begin 
    select t.proc_name into v_proc_name 
    from proc_map t 
    where t.proc_id = ip_start; 
    exception 
    when no_data_found then null; 
    when too_many_rows then null; 
    end; 

    if v_proc_name is not null 
    then 
     execute immediate 'begin ' || v_proc_name || '; end;'; 
    end if; 
end; 

declare 
    v_task_name varchar2(4000) := dbms_parallel_execute.generate_task_name; 
    v_sql varchar2(4000); 
    v_run varchar2(4000); 
    v_thread_count number; 
    v_task_status number; 
begin 
    dbms_parallel_execute.create_task (task_name => v_task_name); 

    v_sql := 'select t.proc_id as num_col 
        ,t.proc_id as num_col 
      from proc_map t 
      where t.is_active = ''Y'' 
      order by t.proc_id'; 

    dbms_parallel_execute.create_chunks_by_SQL (task_name => v_task_name, sql_stmt => v_sql, by_rowid => false); 

    v_run := 'begin p_run_proc (ip_start => :start_id, ip_end => :end_id); end;'; 

    select count(*) into v_thread_count 
    from proc_map t 
    where t.is_active = 'Y'; 

    dbms_parallel_execute.run_task (task_name => v_task_name 
           ,sql_stmt => v_run 
           ,language_flag => dbms_sql.native 
           ,parallel_level => v_thread_count); 

    v_task_status := dbms_parallel_execute.task_status (task_name => v_task_name); 

    if v_task_status = dbms_parallel_execute.FINISHED 
    then 
     dbms_parallel_execute.drop_task (task_name => v_task_name); 
    else 
     raise_application_error (-20001, 'ORA in task ' || v_task_name); 
    end if; 

end; 
-2

をやろうとしています何

TODAY

STORED PROCEDURE charge_file 
STORED PROCEDURE insert_table1 
STORED PROCEDURE insert_table2 
STORED PROCEDURE insert_table3 ... 
STORED PROCEDURE return_file 

は、例えば、リンクの下に参照してくださいません

: - http://www.dba-oracle.com/r_execute_pl_sql_in_parallel.htm

0

一切あり、内蔵されたフォーク/背景には、PL/SQLでDBMS_SCHEDULERまたはDBMS_JOB古い以外を提出します。 (DBMS_SCHEDULERはより完全な機能を備えており、障害の追跡をはるかに優れています。)私は数年前にプロジェクトとしてジョブ制御オブジェクトを作成しましたが、正直言って使用したことはありません。例としてwww.williamrobertson.net/documents/job-control-object.html

関連する問題