【问题标题】:PLSQL block for run the job using dbms_scheduler for gather statistics of 30 schemaPLSQL 块用于运行作业,使用 dbms_scheduler 收集 30 个模式的统计信息
【发布时间】:2019-05-05 19:43:39
【问题描述】:

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

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(30).ownname := "xy";
      dbms_stats.gather_schema_stats( ......)
      end;
      /
      ',
     start_date => sysdate,
     ..........);
     end;
     /

【问题讨论】:

  • sch_lst(1).ownname := "ab"; 应该是 sch_lst(1).ownname := ''ab'';(两个单引号而不是一个双引号)
  • @a_horse_with_no_name 是否会运行或为什么我们在这里使用' ' 而不是"

标签: oracle plsql dbms-scheduler


【解决方案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>');查看作业

【讨论】:

    【解决方案2】:

    首先,你可以创建这样一个程序:

    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;
    

    编辑:您可以将您的程序代码替换为:

    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
      begin
        dbms_stats.gather_schema_stats(c.username,degree => 4, cascade => true );      
       exception when others then 
        dbms_output.put_line(sqlerrm);
      end;
     end loop;
    end;
    

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

    【讨论】:

    • 我们可以用' '代替"吗?
    • @user8487380 是的,如果必须在引号内使用引号,我们主要使用''(每个单引号内重复单引号)。是的,我们可以创建dbms_scheduler,而无需像PL/SQL BLOCK 这样的存储过程,就像您使用这种格式:PLSQL_BLOCK,但每个双引号" 必须替换为'',我更喜欢使用STORED PROCEDURE .
    • 在声明语句内部表示job_action 我使用''(双单引号)而不是" 而在外部我保留',因为它来自start_date 参数。是不是很好。
    • @user8487380 将start_date 参数转换为合适的值,例如在不久的将来具有当前日期和时间的值,然后您需要通过dbms_scheduler.enable('jb_gather_stats') 启用,只要达到定义的时间,它应该可以工作,并且running 状态会根据您的工作持续时间持续存在。
    • @user8487380 完全正确,是的。考虑一下:begin for c in ( select level lvl from dual connect by level <= 10 ) loop begin dbms_output.put_line(c.lvl / (c.lvl - 5)); exception when others then dbms_output.put_line(sqlerrm); end; end loop; end; 在第 5 行引发异常,但之后会进行迭代。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-07
    • 2011-04-13
    • 2018-02-01
    • 1970-01-01
    • 2017-04-06
    相关资源
    最近更新 更多