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 将是您的第二个函数需要做的所有事情。
假设我有一项功能可以完成大量创建文件和报告的工作。 我需要一个选项来使用保存点中止执行和回滚更改。
我还不知道,我可以从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 将是您的第二个函数需要做的所有事情。