带有 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;';