WBA*_*BAR 5 database plsql oracle11g
我准备了一些小提琴:
CREATE TABLE t_process
("process_number" int, "process_status" varchar2(12))
;
INSERT ALL
INTO t_process ("process_number", "process_status")
VALUES (1, 'PROCESSING')
INTO t_process ("process_number", "process_status")
VALUES (2, 'PROCESSING')
INTO t_process ("process_number", "process_status")
VALUES (3, 'TO_BE_KILLED')
INTO t_process ("process_number", "process_status")
VALUES (4, 'PROCESSING')
INTO t_process ("process_number", "process_status")
VALUES (5, 'PROCESSING')
INTO t_process ("process_number", "process_status")
VALUES (6, 'TO_BE_KILLED')
INTO t_process ("process_number", "process_status")
VALUES (7, 'TO_BE_KILLED')
INTO t_process ("process_number", "process_status")
VALUES (8, 'WAITING')
INTO t_process ("process_number", "process_status")
VALUES (9, 'KILLED')
SELECT * FROM dual
;
Run Code Online (Sandbox Code Playgroud)
这是我的处理程序:
CREATE OR REPLACE PROCEDURE MY_PROCEDURE(IN_ID IN NUMBER) IS
BEGIN
UPDATE T_PROCESS SET process_status = 'KILLING' WHERE process_number = IN_ID;
COMMIT;
-- DO SOME STUFF
UPDATE T_PROCESS SET process_status = 'KILLED' WHERE process_number = IN_ID;
COMMIT;
END MY_PROCEDURE;
Run Code Online (Sandbox Code Playgroud)
现在我想用来DBMS_PARALLEL_EXECUTE运行这个自定义SQL:
DECLARE
id1 number = :id1;
id2 number = :id2;
BEGIN
MY_PROCEDURE(id1);
END;
Run Code Online (Sandbox Code Playgroud)
所以,我的问题是:
我可以DBMS_PARALLEL_EXECUTE用来执行上面的SQL语句吗?
因为我只找到了UPDATE例子.也许CREATE_CHUNKS_BY_SQL只选择TO_BE_KILLED然后RUN_TASK用上面的声明?
是的,您可以很好地做到 11g 以上。我很惊讶为什么这里没有建议它。
您可以在 run_task 中执行一个过程,例如 begin MY_PROCEDURE( :start_id, :end_id ); end;
您可能需要修改程序以接受两个参数:start_id,:end_id
这是示例代码(基于“create_chunks_by_rowid”)。
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;
/
Run Code Online (Sandbox Code Playgroud)
您也可以create chunks根据您的情况/舒适度通过以下方式。
CREATE_CHUNKS_BY_NUMBER_COL -- 如果你想通过'process_number'更新
CREATE_CHUNKS_BY_SQL -- 如果您认为 BY_SQL 将为您提供一组非常小的要处理的块。请注意,在这种方法中,每个块只能处理每个块的 1 行(每个块的start_id 和 end_id 将相同)。
| 归档时间: |
|
| 查看次数: |
2970 次 |
| 最近记录: |