2013-08-26 5 views
0

Вот код процедура Oracle для вызова из Java:Вызов процедуры Oracle с Java - что происходит при вызове System.exit()?

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){ 

} 

Если пользователь вызывает System.exit() на этой Java JVM - то, что происходит с процедурой Oracle, которая была вызвана? Гарантируется ли работа в Oracle? Или, возможно, чтобы гарантировать это, я должен отправить его в планировщик заданий Oracle вместо этого? До сих пор мой опыт состоял в том, что иногда процедура продолжает работать, даже если JVM завершается, а иногда и нет. Имеет ли это какое-либо отношение к «регистрации параметра out»? Будет ли код попадать в блок catch, если вызывается System.exit?

У кого-нибудь есть опыт?

+0

Не он не будет продолжать работать. В какой-то момент ваша сессия будет прекращена. – OldProgrammer

+0

ok, отправит ли планировщик заданий Oracle решить эту проблему? –

ответ

0

Этот код, который я украл у Майка Макаллистера, который он также украл с форума Oracle, решает проблему, о которой я упоминал в этом вопросе. Он работает, и вы можете передавать динамические переменные в качестве параметров, а не только жестко заданные значения.

этот вопрос SO также решает проблему:

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; 
/