首页 文章

用于使用dbms_scheduler运行作业的PLSQL块,用于收集10个模式的统计信息

提问于
浏览
0

我想创建一个PL / SQL块,尝试使用dbms_scheduler包运行作业,我想收集所有10个模式的模式统计信息 . 例如:

begin
     dbms_scheduler_create_job(
     job_name => ....,
     job_type = > 'PL/SQL BLOCK',
     job_action => 'declare
      sch_lst dbms_stats.objecttab := dbms_stats.objecttab()
      begin
      sch_lst.extend(10);
      sch_lst(1).ownname := "ab";   --ab is the Schema name
      sch_lst(2).ownname := "cd";
      .........
      sch_lst(10).ownname := "kl";
      dbms_stats.gather_schema_stats( ......)
      end;
      /
      ',
     start_date => sysdate,
     ..........);
     end;
     /

2 回答

  • 1

    首先,您可以创建这样的过程:

    create or replace procedure pr_schema_stats is
      sch_lst owa.vc_arr;
    begin
      sch_lst(1) := 'ab';
      sch_lst(2) := 'cd';  
      sch_lst(3) := 'ef';
      sch_lst(4) := 'gh';  
      sch_lst(5) := 'ij';
      sch_lst(6) := 'kl';  
      sch_lst(7) := 'mn';
      sch_lst(8) := 'op';  
      sch_lst(9) := 'rs';  
      sch_lst(10):= 'tu';  
    
     for i in 1..10
     loop    
       dbms_stats.gather_schema_stats(upper(sch_lst(i)),degree => 4, cascade => true );      
     end loop;
    end;
    

    然后从调度程序调用:

    declare
        v_job_name varchar2(70) := 'jb_gather_stats';
    begin  
        dbms_scheduler.create_job(
            job_name => v_job_name,
            job_type => 'STORED_PROCEDURE',
            job_action => 'pr_schema_stats', 
            start_date => to_date('04-12-2018 19:00:00', 'dd-mm-yyyy hh24:mi:ss'),
            repeat_interval => 'FREQ=MONTHLY;INTERVAL=1;',
            auto_drop => false,
            comments => 'Produces statistics for Cost based SQL statements');
    
        dbms_scheduler.enable(v_job_name);    
    end;
    

    EDIT : 您可以用以下代码替换您的程序代码:

    create or replace procedure pr_schema_stats is   
    begin
    
     for c in (   
               select u.username,
                     row_number() over (order by u.username) as rn
                from dba_users u
               where u.account_status = 'OPEN' 
                 and u.username not like 'SYS%' 
               )
     loop
       dbms_output.put_line(c.username,degree => 4, cascade => true );      
     end loop;
    end;
    

    在分析任务中包含所有普通模式 .

  • 1

    start_date => sysdate, 之前删除 / 并且还在模式名称而不是 " (双引号)中使用 '' (双单引号),因为它位于声明语句中,该声明已在单引号内 .

    begin
     dbms_scheduler_create_job(
     job_name => ....,
     job_type = > 'PL/SQL BLOCK',
     job_action => 'declare
      sch_lst dbms_stats.objecttab := dbms_stats.objecttab()
      begin
      sch_lst.extend(10);
      sch_lst(1).ownname := ''ab'';   --ab is the Schema name
      sch_lst(2).ownname := ''cd'';
      .........
      sch_lst(10).ownname := ''kl'';
      dbms_stats.gather_schema_stats( ......)
      end;
      ',
     start_date => sysdate,
     ..........);
     end;
     /
    

    然后编译这个 . 你可以使用 execute dbms_schedule.run_job('<job_name>'); 检查工作

相关问题