Передача аргументов хранимой процедуре Oracle через задание планировщика
У меня есть хранимая процедура, которая вызывается из задания DBMS. т.е.
DBMS_SCHEDULER.RUN_JOB ('Procedure_JB', FALSE);
Хранимая процедура Java-кода, которая после выполнения каких-либо действий запускает процедуру ас_инхронно. И тогда эта процедура_JB вызывает процедуру_Программа, а затем программа будет вызывать хранимую процедуру.
Как я могу передать аргументы моей хранимой процедуре?
- Аргументы, которые я должен передать на работу, взяты из Java.
3 ответа
Определите вашу работу по процедуре_JB, чтобы принимать аргументы. Затем используйте dbms_scheduler.set_job_argument_value, чтобы определить значение аргументов, которые вы хотите передать в программу, которую будет выполнять ваша работа. Пример (взят из https://forums.oracle.com/forums/thread.jspa?threadID=483135)
-- 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;
/
Вместо этого используйте PLSQL_BLOCK:
begin
dbms_scheduler.create_job (
job_name => 'myjob',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN myproc(''first arg'',''second arg''); END;',
start_date => sysdate,
repeat_interval => 'FREQ=HOURLY',
enabled => true
);
end;
/
Как это могло работать в версии 19c (может быть и раньше)
BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'TMP_JOB_'||'test_procedure_job', -- customize job name
job_type => 'STORED_PROCEDURE',
job_action => 'PACKAGE_NAME.test_procedure',
number_of_arguments => 2,
start_date => NULL,
repeat_interval => NULL,
end_date => NULL,
enabled => FALSE,
auto_drop => TRUE, -- in my case onetimer object - not to store in DB schema
comments => '');
dbms_scheduler.set_job_argument_value(job_name => 'TMP_JOB_'||'test_procedure_job',
argument_position => 1,
argument_value => ''||'text_arg');
dbms_scheduler.set_job_argument_value(job_name => 'TMP_JOB_'||'test_procedure_job',
argument_position => 2,
argument_value => 100500); -- number arg
DBMS_SCHEDULER.enable(name => 'TMP_JOB_'||'test_procedure_job');
END;