暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 调度查询

ASKTOM 2020-02-10
642

问题描述

嗨,康纳,克里斯,

您能否看一下与dbms_scheduler程序和作业setu相关的以下场景:

-------------- Start Use Case Setup --------------
---------------------------------------------------------------------------------------------------
-- 1. Create Record and Collection
create or replace TYPE table_rec as object (create_dt DATE
                                           ,dept_id   NUMBER(11,0)
                                           ,emp_id    NUMBER(11,0)
                                           )
/

show errors;
/

create or replace TYPE t_table_coll as table of table_rec
/

show errors;
/
---------------------------------------------------------------------------------------------------
-- 2. Create Procedure 
create or replace procedure populate_coll_into_table(p_job_id in varchar, p_t_table_coll in t_table_coll, p_no_of_reties in number)
is
begin
    dbms_output.put_line('Inside Procedure - p_job_id='||p_job_id||'- p_t_table_coll='||p_t_table_coll.count||'- p_no_of_reties='||p_no_of_reties); 
    for rec in p_t_table_coll.first .. p_t_table_coll.last
 loop
       dbms_output.put_line('Iteration #'||rec); 
       dbms_output.put_line('create_dt='||p_t_table_coll(rec).create_dt||'#emp_id='||p_t_table_coll(rec).emp_id||'#dept_id='||p_t_table_coll(rec).dept_id);
    end loop; 
exception 
when others then
   dbms_output.put_line('Error=>'||SQLERRM); 
end populate_coll_into_table;
/

show errors;
/
---------------------------------------------------------------------------------------------------
-- 3. Create Program
set serveroutput on;
begin
    dbms_scheduler.create_program(program_name        => 'PRG_POPULATE_COLL_INTO_TABLE',
                                  program_action      => 'POPULATE_COLL_INTO_TABLE',
                                  program_type        => 'STORED_PROCEDURE',
                                  number_of_arguments => 3,
                                  enabled             => false
    );
    dbms_output.put_line('Program: PRG_POPULATE_COLL_INTO_TABLE created..');
    dbms_scheduler.define_anydata_argument(program_name      => 'PRG_POPULATE_COLL_INTO_TABLE',
                                           argument_position => 1,
                                           argument_name => 'P_JOB_ID',             
                                           argument_type     => 'VARCHAR2',
                                           default_value     => null
    );
    dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 1.');
    dbms_scheduler.define_anydata_argument(program_name      => 'PRG_POPULATE_COLL_INTO_TABLE',
                                           argument_position => 2,
                                           argument_name => 'P_T_TABLE_COLL',
                                           argument_type     => 'T_TABLE_COLL',
                                           default_value     => NULL);
    dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 2.');
    dbms_scheduler.define_anydata_argument(program_name      => 'PRG_POPULATE_COLL_INTO_TABLE',
                                           argument_position => 3,
                                           argument_name => 'P_NO_OF_RETIES',
                                           argument_type     => 'NUMBER',
                                           default_value     => null
    );
    dbms_output.put_line('Set Program: PRG_POPULATE_COLL_INTO_TABLE | Parameter 3.');
    
 dbms_scheduler.enable('PRG_POPULATE_COLL_INTO_TABLE');
 
 dbms_output.put_line('Enable Program: PRG_POPULATE_COLL_INTO_TABLE.');
end;
/
-------------- End Use Case Setup --------------
复制


我的要求是调用具有集合作为输入的过程 (对于某些应用程序处理逻辑)。
这个过程应该独立运行 (即在不同的会话中),而不是运行一个。
因此,我使用了dbms_scheduler (下面是相同的设置)。

我使用了dbms_scheduler.run_job (job_name => l_job_name,use_current_session => false); 要在不同的会话中运行该过程,
但是,采用这种方法,即使成功完成了作业,作业也不会自动掉落。

您能帮我解决以下问题吗:
1.在这种情况下如何实现自动下降
2.由于set_job_anydata_value用于将集合输入到scheduler:
a.这些值存储在哪里,就像在SGA、PGA中一样?
b.是否有任何用户 _ * 视图来查找每个作业的输入值?
c.因为我的收集计数可能是大约500条记录和预期的并发作业可以同时运行 (大约100)
是否可以使用更好的方法来实现以下调度方法?

------------ create and execute scheduler ------
----------
declare
    l_job_name        varchar2(30 char) := 'SCOTT_1234';
    gv_t_table_coll  t_table_coll := t_table_coll();
    gv_table_rec   table_rec := table_rec(NULL,NULL,NULL); 
 gv_no_of_reties   number := 2;
begin
    gv_table_rec.create_dt := trunc(sysdate-1);
 gv_table_rec.emp_id := 1001;
 gv_table_rec.dept_id := 100;
    gv_t_table_coll.extend;
    gv_t_table_coll(1) := gv_table_rec;

    gv_table_rec.create_dt := trunc(sysdate-2);
 gv_table_rec.emp_id := 1002;
 gv_table_rec.dept_id := 100;
    gv_t_table_coll.extend;
    gv_t_table_coll(2) := gv_table_rec;
 
    dbms_scheduler.create_job(l_job_name, program_name => 'PRG_POPULATE_COLL_INTO_TABLE', start_date => systimestamp, enabled => false);
    
 dbms_scheduler.set_job_anydata_value(l_job_name, 1, sys.anydata.convertvarchar2(l_job_name));  
    dbms_scheduler.set_job_anydata_value(l_job_name, 2, sys.anydata.convertcollection(gv_t_table_coll));
    dbms_scheduler.set_job_anydata_value(l_job_name, 3, sys.anydata.convertnumber(gv_no_of_reties));
    dbms_scheduler.run_job (job_name => l_job_name, use_current_session => false);

 gv_t_table_coll.delete;
exception 
when others then
    dbms_output.put_line('Error=>'||SQLERRM);
end;
复制

专家解答

1.只需启用作业,它就会在后台会话中运行。然后下降:

declare
    l_job_name        varchar2(30 char) := 'SCOTT_1234';
    gv_t_table_coll  t_table_coll := t_table_coll();
    gv_table_rec   table_rec := table_rec(NULL,NULL,NULL); 
 gv_no_of_reties   number := 2;
begin
    gv_table_rec.create_dt := trunc(sysdate-1);
    gv_table_rec.emp_id := 1001;
    gv_table_rec.dept_id := 100;
    gv_t_table_coll.extend;
    gv_t_table_coll(1) := gv_table_rec;

    gv_table_rec.create_dt := trunc(sysdate-2);
    gv_table_rec.emp_id := 1002;
     gv_table_rec.dept_id := 100;
    gv_t_table_coll.extend;
    gv_t_table_coll(2) := gv_table_rec;
 
    dbms_scheduler.create_job(l_job_name, program_name => 'PRG_POPULATE_COLL_INTO_TABLE', start_date => systimestamp, enabled => false, auto_drop => true);
    
    dbms_scheduler.set_job_anydata_value(l_job_name, 1, sys.anydata.convertvarchar2(l_job_name));  
    dbms_scheduler.set_job_anydata_value(l_job_name, 2, sys.anydata.convertcollection(gv_t_table_coll));
    dbms_scheduler.set_job_anydata_value(l_job_name, 3, sys.anydata.convertnumber(gv_no_of_reties));
    
    gv_t_table_coll.delete;
exception 
when others then
    dbms_output.put_line('Error=>'||SQLERRM);
end;
/

select start_date from user_scheduler_jobs
where  job_name = 'SCOTT_1234';

START_DATE                 
11-FEB-2020 13.42.28 +00  

exec dbms_scheduler.enable ( 'SCOTT_1234' );

select start_date from user_scheduler_jobs
where  job_name = 'SCOTT_1234';

no rows selected
复制


2.
a.变量存储在PGA中

b.我不知道有什么。它们不会出现在用户调度器作业运行详细信息/作业日志中

c.我对你想做什么还不够了解。这里的目标是什么?为什么提交那么多并发作业?
文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论