SQL%ROWCOUNT
是否有DBMS_PARALLEL_EXECUTE
的等价物?目前,如果我在声明后运行SQL%ROWCOUNT
,它将只返回1.
非常感谢帮助。谢谢=)
答案 0 :(得分:1)
这是一个有趣的问题!我从未意识到这种需要。可能是因为DBA_PARALLEL_EXECUTE被设计并通常用于影响其大部分的大型表(mn行)上的DML操作。
因此,对我来说,每个块的行数受影响(SQL$ROWCOUNT
)并不重要。
我有自己的验证脚本,最终验证任务是否达到了它的总体目的。
但是,这可能会在未来的oracle版本中引入。 据我所知(高达12c),没有DBA_PARALLEL_EXECUTE视图给出这个 其他信息
话虽如此,您始终可以通过run_task编写和调用自定义过程。在SQL$ROWCOUNT
内进行DML操作后,您可以在日志文件或表中编写MY_PROCEDURE
。
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;
/
答案 1 :(得分:0)
我认为你不能 - 基本上你要问的是为你运行的每个块执行的每个任务的SQL%ROWCOUNT是多少。 DBMS_PARALLEL_EXECUTE子程序似乎没有任何方法可以找出在该块中更新了多少记录,并且DBA_PARALLEL_EXECUTE_CHUNKS表没有在块中有行数。
我能想到的最好方法是将SQL $ ROWCOUNT放入您正在执行的每个任务中,并将其写入表中,然后在任务结束时对其进行求和,或者进行选择计数(*)一旦任务完成并计算您更新的行(假设您可以从更新中判断 - 如果您设置了已处理的标志或批次ID或其他内容)。