使用DBMS_PARALLEL_EXECUTE.RUN_TASK时遇到问题

时间:2018-02-27 03:25:00

标签: sql oracle plsql

我正在使用DBMS_PARALLEL_EXECUTE,但程序似乎在到达DBMS_PARALLEL_EXECUTE.RUN_TASK时永远运行。前两个步骤:CREATE_TASKCREATE_CHUNKS_BY_ROWID工作正常,但我不确定为什么程序在到达RUN_TASK时会永远运行。

-- create task and create chunks by rowid
L_sql := 'DELETE FROM sample_table WHERE <some_codition>
AND rowid BETWEEN :start_id AND :end_id';
DBMS_PARALLEL_EXECUTE.RUN_TASK('test_task',
                                L_sql, 
                                DBMS_SQL.NATIVE,
                       parallel_level => 10)
    L_try := 0;
  L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('test_task');
  WHILE(l_try < 2 and L_status != DBMS_PARALLEL_EXECUTE.FINISHED) 
  LOOP
    L_try := l_try + 1;
    DBMS_PARALLEL_EXECUTE.RESUME_TASK('test_task');
    L_status := DBMS_PARALLEL_EXECUTE.TASK_STATUS('test_task');
  END LOOP;


  DBMS_PARALLEL_EXECUTE.DROP_TASK('test_task');

在将L_sql发送到run_task过程之前,我应该在表名前加上模式名吗?我无法弄清楚该做什么,请帮忙。

1 个答案:

答案 0 :(得分:0)

所有DBMS_PARALLEL_EXECUTE正在执行,使用调度程序运行多个数据库会话,并且每个会话正在运行DELETE语句。 “create_chunks _...”例程是通过这种方式告诉数据库如何对该删除命令进行分段,以使会话不会重叠。

因此你的陈述

L_sql := 'DELETE FROM sample_table WHERE <some_codition>'

会出现问题,因为没有任何内容可以对数据进行细分。事实上,你将有“n”个调度程序会话都试图删除相同的行(所有这些行)。因此(n-1)将被阻止。

将其更改为

L_sql := 'DELETE FROM sample_table WHERE <some_codition> 
          AND rowid BETWEEN :start_id AND :end_id'

这样当每个任务运行时,绑定变量start_id / end_id将传递表rowid与每个任务相关的子集。