Bo's Oracle Station

查看: 3121|回复: 0

第31次活动:2017-11-08(星期三晚上7:00-9:30)

[复制链接]

1005

主题

1469

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
12012
发表于 2017-11-8 20:20:23 | 显示全部楼层 |阅读模式
轻量级作业和作业矩阵:
  1. create table t05317_lw( a timestamp ) ;

  2. create or replace procedure proc05317_lw
  3. is
  4. v_1 number;
  5. begin
  6.    select count(*) into v_1 from employees a, employees b;
  7.    insert into  t05317_lw values(systimestamp);
  8.    commit;
  9. end;

  10. begin
  11.    dbms_scheduler.create_job(
  12.    job_name => 'hr.job8',
  13.    program_name=>'hr.program8',
  14.    schedule_name=>'hr.schedule8',
  15.    job_style=>'LIGHTWEIGHT');
  16. end;

  17. select  * from t05317_lw;

  18. select  j.job_name  , j.stop_on_window_close  ,j.JOB_STYLE, j.ENABLED
  19. from user_scheduler_jobs  j
  20. where j.job_name  like 'JOB%';


  21. begin
  22.    dbms_scheduler.enable('HR.JOB8');
  23. end;

  24. select  * from hr.t05317_lw;

  25. truncate table hr.t05317_lw;
  26. -----
  27. DECLARE
  28. newjob sys.job;
  29. newjobarr sys.job_array;
  30. BEGIN
  31. -- Create an array of JOB object types
  32.   newjobarr := sys.job_array();
  33. -- Allocate sufficient space in the array
  34.   newjobarr.extend(10000);
  35. -- Add definitions for jobs
  36. FOR i IN 1..10000 LOOP
  37.    -- Create a JOB object type
  38.    newjob := sys.job(job_name => 'HR.JOB8' || to_char(i),
  39.                      job_style => 'LIGHTWEIGHT',
  40.                      job_template => 'HR.PROGRAM8',
  41.                    enabled => TRUE );
  42. -- Add job to the array
  43.    newjobarr(i) := newjob;
  44. END LOOP;
  45. -- Call CREATE_JOBS to create jobs in one transaction
  46. DBMS_SCHEDULER.CREATE_JOBS(newjobarr, 'TRANSACTIONAL');
  47. END;

  48. -----
  49. select count(*) from t05317_lw;

  50. -----
  51. select max(a) - min(a) from t05317_lw;
  52. ----

  53. truncate table hr.t05317_lw;


  54. DECLARE
  55. newjob sys.job;
  56. newjobarr sys.job_array;
  57. BEGIN
  58. -- Create an array of JOB object types
  59.   newjobarr := sys.job_array();
  60. -- Allocate sufficient space in the array
  61.   newjobarr.extend(10000);
  62. -- Add definitions for jobs
  63. FOR i IN 1..10000 LOOP
  64.    -- Create a JOB object type
  65.    newjob := sys.job(job_name => 'HR.JOB80_' || to_char(i),
  66.                      job_style => 'REGULAR',
  67.                      job_template => 'HR.PROGRAM8',
  68.                    enabled => TRUE );
  69. -- Add job to the array
  70.    newjobarr(i) := newjob;
  71. END LOOP;
  72. -- Call CREATE_JOBS to create jobs in one transaction
  73. DBMS_SCHEDULER.CREATE_JOBS(newjobarr);
  74. END;


  75. select count(*) from t05317_lw;

  76. -----
  77. select max(a) - min(a) from t05317_lw;
  78. ----
复制代码
重做job4,带元数据参数:
HR:
  1. CREATE TABLE scheduler_test (
  2.   id            NUMBER(10)    NOT NULL,
  3.   created_date  DATE          NOT NULL,
  4.   event_name  varchar2(40) ,
  5.   CONSTRAINT scheduler_test_pk PRIMARY KEY (id)
  6. );

  7. select  * from scheduler_test;
  8. CREATE SEQUENCE scheduler_test_seq;
复制代码
SYS:


  1. CREATE OR REPLACE TYPE t_event_queue_payload AS OBJECT (
  2.   event_name  VARCHAR2(30)
  3. );

  4. grant execute on t_event_queue_payload to hr;

  5. BEGIN
  6.   -- Create a queue table to hold the event queue.
  7.   DBMS_AQADM.create_queue_table(
  8.     queue_table        => 'event_queue_tab',
  9.     queue_payload_type => 't_event_queue_payload',
  10.     multiple_consumers => TRUE,
  11.     comment            => 'Queue Table For Event Messages');
  12.   -- Create the event queue.
  13.   DBMS_AQADM.create_queue (
  14.     queue_name  => 'event_queue',
  15.     queue_table => 'event_queue_tab');
  16.   -- Start the event queue.
  17.   DBMS_AQADM.start_queue (queue_name => 'event_queue');
  18. END;

  19. begin
  20.    dbms_aqadm.grant_queue_privilege(privilege => 'ENQUEUE',queue_name => 'event_queue',grantee => 'HR');
  21. end;
  22.    
  23. begin
  24.    dbms_aqadm.grant_queue_privilege(privilege => 'DEQUEUE',queue_name => 'event_queue',grantee => 'HR');
  25. end;

  26. ----

复制代码
HR:
如果创建的程序需要输入参数,则必须定义完参数后在激活,即创建这个program时将enable设为false,否则提示:
    Ora-27456:程序“ ”的参数并未全部定义;然后再对该program定义参数即执行define_program_argument过程(见1.3)。

  1. create or replace procedure procnew( p_1     sys.t_event_queue_payload    )
  2. is

  3. BEGIN
  4.      INSERT INTO scheduler_test
  5.          VALUES (scheduler_test_seq.NEXTVAL, SYSDATE,  p_1.event_name   );
  6.          COMMIT;
  7. END;


  8. select  * from user_errors;

  9. ----
  10. begin
  11.   dbms_scheduler.create_program (
  12.    program_name => 'programnew',
  13.     program_action=> 'procnew',
  14.     program_type => 'STORED_PROCEDURE',
  15.     number_of_arguments => 1,
  16.     enabled => false) ;
  17. end;

  18. select  * from user_scheduler_programs;
  19. select  * from user_scheduler_program_args;




  20. begin
  21.    dbms_scheduler.define_metadata_argument (
  22.     program_name => 'programnew',
  23.     argument_position => 1 ,
  24.    metadata_attribute => 'EVENT_MESSAGE') ;
  25.    
  26. end;

  27. select  * from user_scheduler_program_args;


  28. begin
  29. dbms_scheduler.enable ('programnew');
  30. end;
复制代码



定除了元数据参数外的其他参数:
/*
1.3 define_program_argument
参数说明:
program_name——程序名称
argument_position——参数位置(也可以知道参数名称选择argument_name)
argument_type——参数类型
default_value——参数默认值

例子:
BEGIN
   dbms_scheduler.define_program_argument(program_name      => 'myprogram',
                                          argument_position => 1,
                                          argument_name     => 'p_lttid',
                                          argument_type     => 'varchar2',
                                          default_value     => 'daaa');
END;

--查看定义的program参数   
SELECT *FROM User_Scheduler_Program_Args;

1.4 define_anydata_argument(用于定义输入参数为复杂类型需采用sys.AnyData类型来包装的参数)
参数说明:
program_name——程序名称
argument_position——参数位置(也可以知道参数名称选择argument_name)
argument_type——参数类型为sys.AnyData
default_value——参数默认值


1.5 define_metadata_argument
有效的metadata attributes有: 'job_name', 'job_subname', 'job_owner', 'job_start', 'window_start',
                             'window_end', and 'event_message'.
Metadata Attribute              Data Type                              Description
job_name                        VARCHAR2                               当前执行的job名称
job_subname                     VARCHAR2                               当前执行的job子名称
job_owner                       VARCHAR2                               当前执行的job所有者
job_start                   TIMESTAMP WITH TIME ZONE                   job启动的时间
window_start                TIMESTAMP WITH TIME ZONE                   window打开的时间
window_end                  TIMESTAMP WITH TIME ZONE                   window关闭的时间
event_message                                                          事件触发job启动的信息

例子:(以下metadata_attribute设置为job_name,即以job_start这个值作为输入参数)
BEGIN
   dbms_scheduler.define_metadata_argument(program_name       => 'myprogram',
                                           argument_position  => 1,
                                           argument_name      => 'p_lttid',
                                           metadata_attribute => 'job_start');
END;

1.6 drop_program_argument
例子:
BEGIN
   dbms_scheduler.drop_program_argument(program_name      => 'myprogram',
                                        argument_position => 1);
END;

*/


------

通过IN型参数(p_1     sys.t_event_queue_payload )捕获queue环境中的event_name这个event_message:

Screenshot.png
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Bo's Oracle Station   

GMT+8, 2024-4-24 03:07 , Processed in 0.048036 second(s), 27 queries .

快速回复 返回顶部 返回列表