带有 OUT 参数调用的 Oracle DBMS_SCHEDULER.create_job
Posted
技术标签:
【中文标题】带有 OUT 参数调用的 Oracle DBMS_SCHEDULER.create_job【英文标题】:Oracle DBMS_SCHEDULER.create_job with OUT parameter call 【发布时间】:2020-05-03 04:43:39 【问题描述】:环境: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;
/
【问题讨论】:
您的代码有误。o_status
需要变量名而不是值。您的工作将执行失败。另外,create job
没有设置 o_status
@Tejash - 感谢您的回复,但请让我知道我做错了什么 - 也许更正我的代码,因为底线是确定我是否可以访问 OUT 参数值,来自返回的计划作业调用。
好的。很简单,不,您无权访问计划作业的 out 参数。但是是的,一种方法是不使用 out 参数,而是将其放在某个表中并使用它。但还要注意,创建作业和执行该作业是两件不同的事情。为什么要在同一过程中使用 out 参数?您可以按照建议查询将放置值的表。
@Tejash - 对不起,我明白你的意思,你能用我的代码演示一下吗?我基本上需要从 systimestamp + 30 秒内确定v_curr_id
的my_status_table
内的状态。我会更新上面的 start_date。
【参考方案1】:
正如@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;';
【讨论】:
太棒了 - 非常感谢史蒂文您的回复,这使它现在更加清晰。以上是关于带有 OUT 参数调用的 Oracle DBMS_SCHEDULER.create_job的主要内容,如果未能解决你的问题,请参考以下文章