我正在使用DBMS_PARALLEL_EXECUTE
,但程序似乎在到达DBMS_PARALLEL_EXECUTE.RUN_TASK
时永远运行。前两个步骤:CREATE_TASK
和CREATE_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过程之前,我应该在表名前加上模式名吗?我无法弄清楚该做什么,请帮忙。
答案 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与每个任务相关的子集。