gpt4 book ai didi

plsql - 甲骨文 11gR2 : Can I use DBMS_PARALLEL_EXECUTE to run my custom PL/SQL code?

转载 作者:太空狗 更新时间:2023-10-30 01:51:20 24 4
gpt4 key购买 nike

我准备了一些fiddle :

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
;

这是我的处理过程:

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;

现在我想使用 DBMS_PARALLEL_EXECUTE 来运行这个自定义的 SQL:

DECLARE
id1 number = :id1;
id2 number = :id2;
BEGIN
MY_PROCEDURE(id1);
END;

所以,我的问题是:

我可以使用DBMS_PARALLEL_EXECUTE来执行上面的SQL语句吗?

因为我只找到了UPDATE的例子。也许 CREATE_CHUNKS_BY_SQL 仅选择 TO_BE_KILLED 然后使用上述语句选择 RUN_TASK

最佳答案

是的,从 11g 开始你就可以很好地做到这一点。我很惊讶为什么这里没有建议。

您可以在 run_task 中执行一个过程,例如 begin MY_PROCEDURE( :start_id, :end_id );结束;

您可能需要修改过程以接受两个参数: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;
/

您也可以根据自己的情况/舒适度通过以下方式创建 block

CREATE_CHUNKS_BY_NUMBER_COL -- 如果你想按'process_number'更新

CREATE_CHUNKS_BY_SQL -- 如果您认为 BY_SQL 将为您提供非常小的待处理 block 集。请注意,在这种方法中,每个 block 只能处理每个 block 的 1 行(start_id 和 end_id 对于每个 block 都是相同的)。

关于plsql - 甲骨文 11gR2 : Can I use DBMS_PARALLEL_EXECUTE to run my custom PL/SQL code?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20130894/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com