代码之家  ›  专栏  ›  技术社区  ›  Swaroop Narasimha

DBMS_并行_执行。仅当任务存在时才删除它-Oracle 11g

  •  1
  • Swaroop Narasimha  · 技术社区  · 6 年前

    在oracle过程中,我创建了一个用于并行执行的任务。

    DBMS_PARALLEL_EXECUTE.create_task('xyz');
    

    在程序结束时,我将任务作为

    DBMS_PARALLEL_EXECUTE.drop_task('xyz');
    

    但是,是否有一种简单的方法可以检查“xyz”任务是否存在(它可能处于任何状态,也可能根本不存在),并在创建同名的新任务之前将其删除。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Kaushik Nayak    6 年前

    您可以查询该表 USER_PARALLEL_EXECUTE_TASKS DBA_PARALLEL_EXECUTE_TASKS 检查任务是否存在。

    SQL> select TASK_NAME,STATUS FROM user_parallel_execute_tasks WHERE TASK_NAME = 'xyz';
    TASK_NAME                           |STATUS
    --------------------------------------------
    xyz                                 |CREATED
    

    因此,在您的过程中添加类似的内容。

    SELECT COUNT(*)
    INTO ct
    FROM user_parallel_execute_tasks
    WHERE task_name = p_task_name;
    
    IF ct > 0 THEN
      DBMS_PARALLEL_EXECUTE.DROP_TASK(p_task_name);
    END  IF;
    
        2
  •  1
  •   ShoeLace    6 年前

    如果删除不存在的任务 TASK_NOT_FOUND 引发异常

    SQL> 
    SQL>  exec DBMS_PARALLEL_EXECUTE.DROP_TASK('NOTEXIST');
    
    Error starting at line : 3 in command -
    BEGIN DBMS_PARALLEL_EXECUTE.DROP_TASK('NOTEXIST'); END;
    Error report -
    ORA-29498: task not found
    ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE_INTERNAL", line 219
    ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE_INTERNAL", line 316
    ORA-06512: at "SYS.DBMS_PARALLEL_EXECUTE", line 100
    ORA-06512: at line 1
    29498. 00000 -  "task not found" 
    *Cause:    The task did not exist.
    *Action:   Use an existing task.
    

    因此,您可以放弃任务,然后像这样捕获异常

    SQL> begin 
      2     DBMS_PARALLEL_EXECUTE.DROP_TASK('NOTEXIST');
      3  exception
      4     WHEN DBMS_PARALLEL_EXECUTE.TASK_NOT_FOUND THEN NULL;
      5  END;
    
    PL/SQL procedure successfully completed.