加入收藏 | 设为首页 | 会员中心 | 我要投稿 新余站长网 (https://www.0790zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长百科 > 正文

plsql – Oracle 11gR2:我可以使用DBMS_PARALLEL_EXECUTE来运行

发布时间:2021-03-05 17:07:53 所属栏目:站长百科 来源:网络整理
导读:我准备了一些 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") VALU

我准备了一些 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,"process_status")
         VALUES (3,'TO_BE_KILLED')
    INTO t_process ("process_number","process_status")
         VALUES (4,"process_status")
         VALUES (5,"process_status")
         VALUES (6,"process_status")
         VALUES (7,"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;
/

您可以根据您的情况/舒适度通过以下方式创建块.

CREATE_CHUNKS_BY_NUMBER_COL – 如果要按’process_number’更新

CREATE_CHUNKS_BY_SQL – 如果您认为BY_SQL将为您提供一组非常小的待处理块.请注意,在这种方法中,每个块只能处理每个块一行(start_id和end_id对于每个块都相同).

(编辑:新余站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读