带有 OUT 参数调用的 Oracle DBMS_SCHEDULER.create_job
Oracle DBMS_SCHEDULER.create_job with OUT parameter call
环境:Oracle 12c
以下不确定,需要确认。
如果我调用一个 job_type PLSQL_BLOCK 计划作业,该作业将从 systdate + 30 秒开始执行,并且有一个 OUT 参数,我假设在计划作业完成后,我将可以访问OUT 参数值,即 v_status
- 根据以下代码示例,这是否正确?
只是不确定何时安排作业。
create or replace package body my_package as
procedure get_status ( in_curr_id in number,
o_status out varchar2 ) is
begin
select status
into o_status
from my_status_table
where curr_id = in_curr_id;
end get_status;
procedure process_task is
v_plsql varchar2(4000) := null;
v_status varchar2(10) := null;
v_curr_id number;
begin
v_curr_id := 100;
v_plsql := 'begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => ' || v_status || '); end;'
dbms_scheduler.create_job(job_name => 'my_scheduled_job',
job_type => 'PLSQL_BLOCK',
job_action => v_plsql,
start_date => sysdate + NUMTODSINTERVAL(30, 'SECOND'),
enabled => true);
if v_status = 'OK' then
-- do required processing
else
dbms_output.put_line(v_status);
end process_task;
end my_package;
/
正如@Tejash 所指出的,DBMS_SCHEDULER 中没有内置任何内容可以将 out 参数的值存储在您的块中。你需要自己做。
改变这个:
v_plsql := 'begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => ' || v_status || '); end;'
对此:
v_plsql := 'declare s my_status_table.status%TYPE;
begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => s);
insert into my_status_table (curr_id, status)
values (' || v_curr_id || ', s);
commit;
end;';
环境:Oracle 12c
以下不确定,需要确认。
如果我调用一个 job_type PLSQL_BLOCK 计划作业,该作业将从 systdate + 30 秒开始执行,并且有一个 OUT 参数,我假设在计划作业完成后,我将可以访问OUT 参数值,即 v_status
- 根据以下代码示例,这是否正确?
只是不确定何时安排作业。
create or replace package body my_package as
procedure get_status ( in_curr_id in number,
o_status out varchar2 ) is
begin
select status
into o_status
from my_status_table
where curr_id = in_curr_id;
end get_status;
procedure process_task is
v_plsql varchar2(4000) := null;
v_status varchar2(10) := null;
v_curr_id number;
begin
v_curr_id := 100;
v_plsql := 'begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => ' || v_status || '); end;'
dbms_scheduler.create_job(job_name => 'my_scheduled_job',
job_type => 'PLSQL_BLOCK',
job_action => v_plsql,
start_date => sysdate + NUMTODSINTERVAL(30, 'SECOND'),
enabled => true);
if v_status = 'OK' then
-- do required processing
else
dbms_output.put_line(v_status);
end process_task;
end my_package;
/
正如@Tejash 所指出的,DBMS_SCHEDULER 中没有内置任何内容可以将 out 参数的值存储在您的块中。你需要自己做。
改变这个:
v_plsql := 'begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => ' || v_status || '); end;'
对此:
v_plsql := 'declare s my_status_table.status%TYPE;
begin get_status (in_curr_id => ' || v_curr_id || ',
o_status => s);
insert into my_status_table (curr_id, status)
values (' || v_curr_id || ', s);
commit;
end;';