通过DBMS_scheduler定义job,实现DB多线程并行处理

来源:互联网 发布:淘宝首页店招尺寸 编辑:程序博客网 时间:2024/04/26 05:46

在DB中要实现多个线程并行进行,可以通过dbms_scheduler的这个调度来定义程序,实现异步job,进行同时运行,从而实现并行。  但相比与java中callable接口实现的多线程(通过Future从CompletionService.take()获取返回,例如:

CompletionService mainJob = new ExecutorCompletionService(executorService);

mainJob.submit(calInterestJobWorker);
Future completeJob = mainJob.take();//等待job返回
String jobName = (String)completeJob.get();

),db这个job没法捕获结果状态,需要自行在job中编写结果处理逻辑。

   -----------------------------------------------------------------------定义--begin--

   --定义PROGRAM
   DBMS_SCHEDULER.CREATE_PROGRAM(PROGRAM_NAME        => 'PROG_SYN_ILOAN_1',
                                 PROGRAM_TYPE        => 'STORED_PROCEDURE',
                                 PROGRAM_ACTION      => 'PKG_ICORE_DM_INTERFACE.proc_syn_dm_iloan_yq',
                                 NUMBER_OF_ARGUMENTS => 2,
                                 ENABLED             => FALSE,
                                 COMMENTS            => NULL);
--【说明:参数从上到下依次分别是:存储过程的名字,存储过程的类型,存储过程要执行的动作(调用哪个存储过程),存储过程的参数个数,存储过程是否能用,存储过程的注释】

   --定义参数
   DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PROG_SYN_ILOAN_1',
                                          ARGUMENT_NAME     => 'P_STAT_DATE',
                                          ARGUMENT_POSITION => 1,
                                          ARGUMENT_TYPE     => 'DATE',
                                          DEFAULT_VALUE     => trunc(SYSDATE));
   DBMS_SCHEDULER.DEFINE_PROGRAM_ARGUMENT(PROGRAM_NAME      => 'PROG_SYN_ILOAN_1',
                                          ARGUMENT_NAME     => 'P_BATCH_NO',
                                          ARGUMENT_POSITION => 2,
                                          ARGUMENT_TYPE     => 'INTEGER',
                                          DEFAULT_VALUE     => 200);
--【说明:参数从上到下依次分别是:存储过程的名字,存储过程的参数类型(就是被调用的存储过程的参数),参数位置,参数类型,参数默认值】


   DBMS_SCHEDULER.ENABLE(NAME => 'PROG_SYN_ILOAN_1');
--【说明:将存储过程设置为可用】

   --增加JOB
   DBMS_SCHEDULER.CREATE_JOB(job_name     => 'JOB_SYN_ILOAN_1',
                             program_name => 'PROG_SYN_ILOAN_1',
                             comments     => 'PKG_ICORE_DM_INTERFACE.proc_syn_dm_iloan_yq IS RUNNING',
                             auto_drop    => true,
                             enabled      => FALSE);
--【说明:定义job加入刚定义的存储过程,并设置跑完后自动删除,初始化不能用,通过以下程序主动启用】

   DBMS_SCHEDULER.ENABLE(NAME => 'JOB_SYN_ILOAN_1');
   -----------------------------------------------------------------------定义--end--

   -----------------------------------------------------------------------调用--begin--

  --1 异步调用YQ-job  (v_stat_date和v_batch_no为已定义的date和number)
  v_job_name1 := 'JOB_SYN_ILOAN_1';
  dbms_scheduler.set_job_argument_value(job_name => v_job_name1,argument_position => 1,argument_value => v_stat_date);
  dbms_scheduler.set_job_argument_value(job_name => v_job_name1,argument_position => 2,argument_value => V_BATCH_NO);
  DBMS_SCHEDULER.run_job(job_name => v_job_name1,
                         use_current_session => FALSE);----注意,调用的时候这里的使用当前会话use_current_session设为false,就可以定义多个异步的job,实现多个job并行执行。程序不会等处理结果,而是直接执行后面程序。从而实现多线程处理。

   -----------------------------------------------------------------------调用--end--





1 0
原创粉丝点击