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

How to force exit a function from another one in PL/SQL ORACLE?

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

我还不知道,我可以从Function2传一个值给Function1,它可以用来退出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;

您不能像 dbms_scheduler 那样直接影响您提交的工作;但您可以修改它运行的过程,让它检查是否应该终止它 - 也许在创建每个文件或报告之后。

您已经将批处理代码作为参数传递给该过程,因此如果您在希望它终止时设置了 get_batch_details return -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;你可以有另一个功能,或者直接在 table 上查找标志。您还需要考虑该检查的开销。

要终止作业,您需要更改 table 上的标志;或做任何使 get_batch_details 变为 return -3 而不是零所需的事情。设置 flag/data 将是您的第二个函数需要做的所有事情。