是否有相当于SQL%ROWCOUNT
运行的DBMS_PARALLEL_EXECUTE
?目前如果我运行SQL%ROWCOUNT
声明后它将只返回1.Oracle SQL%ROWCOUNT等效于DBMS_PARALLEL_EXECUTE
帮助将非常感激。谢谢=)
是否有相当于SQL%ROWCOUNT
运行的DBMS_PARALLEL_EXECUTE
?目前如果我运行SQL%ROWCOUNT
声明后它将只返回1.Oracle SQL%ROWCOUNT等效于DBMS_PARALLEL_EXECUTE
帮助将非常感激。谢谢=)
我不认为你可以 - 基本上你会问什么是为你运行的块执行的每个任务的SQL%ROWCOUNT。 DBMS_PARALLEL_EXECUTE子程序似乎没有任何方法可以找出在该块中更新了多少记录,并且DBA_PARALLEL_EXECUTE_CHUNKS表没有该块中的行数。
我能想到的最佳方式是将SQL $ ROWCOUNT放入您正在执行的每个任务中,并将其写入表中,然后在任务结束时对其进行求和,或者执行select在任务完成后计数(*)并计数您更新的行(假设您可以从更新中得知 - 如果您设置了已处理标志或批次ID或其他)。
这是一个有趣的问题!我从未意识到需要。也许是由于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;
/
您的意思是'SQL%ROWNUMS'或'SQL%ROWCOUNT' – Exhausted
是的,我的不好...它应该是SQL%ROWCOUNT –