假设我有一个功能,可以创建大量文件和报告。 我需要一个选项来使用保存点中止执行和回滚更改。
我仍然不知道,我可以将值传递给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;
答案 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而不是零的必要条件。设置该标志/数据将是您的第二个功能所需要的。