以下是从Java调用的Oracle过程的代码:
CallableStatement st = connection.prepareCall("{call PROCEDURE_0(?,?,?)}");
st.setInt(1,xyz1);
st.setString(2,xyz2);
st.setInt(3,int_variable);
st.registerOutParameter(3,Types.INTEGER);
try{
st.execute();
}
catch(Exception e){
}
如果用户在此Java JVM上调用System.exit(),那么调用的Oracle过程会发生什么?是否保证在Oracle中继续运行?或者,为了保证这一点,我应该将其提交给Oracle作业调度程序?到目前为止,我的经验是,即使JVM终止,有时程序仍会继续运行,有时则不会。这与“注册参数”有什么关系吗?如果调用System.exit,代码是否会到达catch块?
有没有人有这方面的经验?
答案 0 :(得分:0)
我从迈克·麦卡利斯特那里偷走了这个代码,他从甲骨文论坛上偷走了这个代码,解决了我在这个问题中提到的问题。它可以工作,你可以将动态变量作为参数传递,而不仅仅是硬编码值。
这个问题也解决了这个问题:
Passing arguments to oracle stored procedure through scheduler job
-- create a stored procedure with two arguments
create or replace procedure myproc (arg1 in varchar2, arg2 in varchar2)
is BEGIN null; END;
/
-- create a program with two arguments and define both
begin
dbms_scheduler.create_program
(
program_name=>'myprog',
program_action=>'myproc',
program_type=>'STORED_PROCEDURE',
number_of_arguments=>2, enabled=>FALSE
) ;
dbms_scheduler.DEFINE_PROGRAM_ARGUMENT(
program_name=>'myprog',
argument_position=>1,
argument_type=>'VARCHAR2',
DEFAULT_VALUE=>'13');
dbms_scheduler.DEFINE_PROGRAM_ARGUMENT(
program_name=>'myprog',
argument_position=>2,
argument_type=>'VARCHAR2');
dbms_scheduler.enable('myprog');
end;
/
-- create a job pointing to a program and set both argument values
begin
dbms_scheduler.create_job('myjob',program_name=>'myprog');
dbms_scheduler.set_job_argument_value('myjob',1,'first arg');
dbms_scheduler.set_job_argument_value('myjob',2,'second arg');
dbms_scheduler.enable('myjob');
end;
/