Oracle SQL%ROWCOUNT等效于DBMS_PARALLEL_EXECUTE

时间:2015-01-09 08:22:57

标签: sql oracle

SQL%ROWCOUNT是否有DBMS_PARALLEL_EXECUTE的等价物?目前,如果我在声明后运行SQL%ROWCOUNT,它将只返回1.

非常感谢帮助。谢谢=)

2 个答案:

答案 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或其他内容)。