Oracle DBMS_SCHEDULER.create_job с вызовом параметра OUT - PullRequest
1 голос
/ 03 мая 2020

Env: Oracle 12 c

Не уверены в следующем и требуют подтверждения.

Если я вызову запланированное задание 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;
/

1 Ответ

1 голос
/ 03 мая 2020

Как указывает @ Teja sh, в DBMS_SCHEDULER ничего не встроено, чтобы хранить значения ваших аргументов в вашем блоке. Вы должны сделать это сами.

Измените это:

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;';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...