带有 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_idmy_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的主要内容,如果未能解决你的问题,请参考以下文章

php调用oracle带有out参数的存储过程

Oracle 存储过程中OUT参数的用法

oracle存储过程,IN OUT 类型的参数怎么传参数

Oracle 10g实现存储过程异步调用

调用带有 out 参数的方法时检查弃元参数

调用带有 out 参数的方法时检查弃元参数 #yyds干货盘点#