如何在PL / SQL ORACLE中强制退出另一个函数?

时间:2015-08-25 14:32:40

标签: oracle plsql stored-functions

假设我有一个功能,可以创建大量文件和报告。 我需要一个选项来使用保存点中止执行和回滚更改。

我仍然不知道,我可以将值传递给Function1 Function2,可以用来退出Function1吗?

如果我误解了某些事情,请告诉我,这是2008年应用程序的维护工作。我不习惯PL / SQL。

欢迎任何建议或更正。 该功能看起来已经是(我删除了关键信息):

FUNCTION LAUNCH_BATCH(p_batch_code IN batch_details.batch_code%TYPE,
                      -- other parameters omitted
                     )
  RETURN PLS_INTEGER
IS
  v_counter       PLS_INTEGER := 0.;
  Response        PLS_INTEGER;
  v_commande      VARCHAR2(1000);
  v_format_date   VARCHAR2(16);
  v_oracle_job_id NUMBER;

  BEGIN

    Response := GET_BATCH_DETAILS(p_batch_code);

    IF Response <> 0 THEN
      IF Response = -2 THEN
        p_error_batch := ERR_EXCEPTION_ORA;
      ELSE
        p_error_batch := ERR_BATCH_NOT_FOUND;
      END IF;

      RETURN (Response);
    END IF;

    UPDATE batch_details
       SET business_date = p_business_date,
     WHERE batch_code = v_batch_details_record.batch_code;

    COMMIT;

    dbms_job.SUBMIT(v_oracle_job_id,
                    v_batch_details_record.procedure_name_to_call
                    || '(''' || p_business_date
                    || ''','
                    || ''''
                    || v_batch_details_record.batch_code
                    || ''','
                    || ''''
                    || v_batch_details_record.bank_code || ''');');
    COMMIT;

    RETURN (0.);

    EXCEPTION WHEN OTHERS THEN
    RETURN (- 1.);
  END LAUNCH_BATCH;

1 个答案:

答案 0 :(得分:1)

您无法直接影响提交的作业,就像使用dbms_scheduler一样;但你可以修改它运行的程序,使其检查是否应该终止 - 也许在创建每个文件或报告之后。

您已经将批处理代码作为参数传递给程序,所以如果您希望它终止时get_batch_details返回-3,那么您可以将检查分散到程序中:

...
create_file_1; -- whatever code you currently have to do work
if get_batch_details(p_batch_code) = -3 then
  rollback work;
  return;
end if;
create_report_2; -- whatever code you currently have to do work
if get_batch_details(p_batch_code) = -3 then
  rollback work;
  return;
end if;

等。您可能不想经常检查。而且你可以引发异常,或者通过调度程序传回,或者程序处理自己 - 例如:

procedure some_proc_run_as_job(p_business_date date,
  p_batch_code varchar2, p_bank_code)
is
  self_destruct exception;
  procedure check_for_self_destruct is
  begin
    if get_batch_details(p_batch_code) = -3 then
      raise self_destruct;
    end if;
  end check_for_self_destruct;
  ...
begin
  create_file_1;
  check_for_self_destruct;
  create_report_2;
  check_for_self_destruct;
  ....
exception
  when check_for_self_destruct then
    rollback;
    return;
end some_proc_run_as_job;

当然,您不必使用get_batch_details;你可以有另一个功能,或者只是直接在桌子上查看一个标志。您也需要考虑该检查的开销。

要使作业终止,您需要更改表格上的标志;或做任何使get_batch_details返回-3而不是零的必要条件。设置该标志/数据将是您的第二个功能所需要的。