2015-01-09 82 views

回答

0

我不认为你可以 - 基本上你会问什么是为你运行的块执行的每个任务的SQL%ROWCOUNT。 DBMS_PARALLEL_EXECUTE子程序似乎没有任何方法可以找出在该块中更新了多少记录,并且DBA_PARALLEL_EXECUTE_CHUNKS表没有该块中的行数。

我能想到的最佳方式是将SQL $ ROWCOUNT放入您正在执行的每个任务中,并将其写入表中,然后在任务结束时对其进行求和,或者执行select在任务完成后计数(*)并计数您更新的行(假设您可以从更新中得知 - 如果您设置了已处理标志或批次ID或其他)。

0

这是一个有趣的问题!我从未意识到需要。也许是由于DBA_PARALLEL_EXECUTE被设计并用于大型表(mn行)上的DML操作,影响了大部分表。 因此,对于我而言,每个块受影响的行数(SQL$ROWCOUNT)并不重要。 我有我自己的验证脚本来验证任务是否达到了其总体目的。

但是,这也许可以在未来的oracle版本中引入。 据我所知(高达12C)都不DBA_PARALLEL_EXECUTE意见给

说了这么多,你总是可以编写和调用定制程序通run_task这 额外的信息。您可以在MY_PROCEDURE内的DML操作之后在日志文件或表中写入SQL$ROWCOUNT

DECLARE 
    l_task  VARCHAR2(30) := 'parallel_processing'; 
    l_sql_stmt VARCHAR2(32767); 
    l_try  NUMBER; 
    l_status NUMBER; 
BEGIN 
    DBMS_PARALLEL_EXECUTE.create_task (task_name => l_task); 

    DBMS_PARALLEL_EXECUTE.create_chunks_by_rowid(task_name => l_task, 
               table_owner => 'SCHEMANAME', 
               table_name => 'T_PROCESS', 
               by_row  => TRUE, 
               chunk_size => 10000); 

    l_sql_stmt := 'begin MY_PROCEDURE(:start_id, :end_id); end;'; 

    DBMS_PARALLEL_EXECUTE.run_task(task_name  => l_task, 
           sql_stmt  => l_sql_stmt, 
           language_flag => 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(l_task); 
    WHILE(l_try < 2 and l_status != DBMS_PARALLEL_EXECUTE.FINISHED) 
    Loop 
    l_try := l_try + 1; 
    DBMS_PARALLEL_EXECUTE.resume_task(l_task); 
    l_status := DBMS_PARALLEL_EXECUTE.task_status(l_task); 
    END LOOP; 

    DBMS_PARALLEL_EXECUTE.drop_task(l_task); 
END; 
/