自动编译失效存储过程和索引

CREATE OR REPLACE PROCEDURE PRC_COMPILE_INVALID
 IS
  --/************************************************************************************
  -- 程序名称:    PRC_COMPILE_INVALID
  -- 功能描述:    每天编译失效的存储过程和失效的索引
  -- 输入参数:    'YYYYMM' - <作业的处理日期>
  -- 输出参数:    0 - <0为正常结束,其余为异常>
  -- 输入资源:
  -- 输出资源:
  -- 中间资源:    <用户名>.<中间表或视图等对象名>
  -- 创建人员:    XXX
  -- 创建日期:    20120528
  -- 版本说明:    V1.0
  -- 修改人员:    (针对程序的任何修改都需要记录修改人员)
  -- 修改日期:    (针对程序的任何修改都需要记录修改日期)
  -- 修改原因:    (针对程序的任何修改都需要记录修改原因,如果多次修改需依次记录)
  -- 版本说明:
  -- 执行说明:
  -- 公司名称:    
  --/************************************************************************************
  --执行MM月的数据,输入的日期参数为YYYY(MM+1)DD,如'20091201'则是执行11月份的数据。

  -- 编写规则说明
  -- 说明1:所有自定义变量均用小写,并以v_打头;所有字段名均用大写
  -- 说明2: 所有关键值均用大字;模式名、表名、函数名、存储过程名均用大写
  -- 说明3: 缩进同其它程序,里面的逻辑体比外面的逻辑体向有缩进一个TAB键。
  --        对齐主要是针对SQL语句,采用关键字换行和右对齐的方式(如果不方便也可使用左对齐。
  -- 说明4: SQL语句目标和源要齐整
  -- 说明5: 对每个表的数据作改变后都要显示的提交
  v_sql       VARCHAR2(10000) DEFAULT ''; -- 动态SQL变量,注意SQL长度
  v_prc       VARCHAR2(40);
  v_date      VARCHAR2(8);
  v_stepnum   NUMBER          DEFAULT 0;           -- 运行步骤
  v_errmsg    VARCHAR2(1024)  DEFAULT '正常';
BEGIN
  v_prc:='PRC_COMPILE_INVALID';
  SELECT to_char(SYSDATE,'yyyymmdd') INTO v_date FROM  dual;
  --正文SQL处理
  --循环将无效存储过程取出 对其进行编译
  v_stepnum :=v_stepnum+1;
       For x In (Select Object_Name From user_objects Where Status = 'INVALID' And Object_Type = 'PROCEDURE') Loop
        v_sql := 'Alter Procedure ' || x.Object_Name || ' COMPILE';
        Begin
             EXECUTE IMMEDIATE v_sql;
        PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,SQL%ROWCOUNT);
        COMMIT;
        End;
       End Loop;

      --将无效索引取出  对其进行编译
     v_stepnum :=v_stepnum+1;
       FOR y In (SELECT  t.index_name from  all_indexes t WHERE t.owner='XXXXXXX' AND t.status='UNUSABLE') Loop
        v_sql := 'ALTER INDEX '||y.index_name ||' rebuild ';
        Begin
             EXECUTE IMMEDIATE v_sql;
        PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,SQL%ROWCOUNT);
        COMMIT;
        End;
       End Loop;


          --取出无效函数 进行编译
     v_stepnum :=v_stepnum+1;
       FOR y In (SELECT t.object_name FROM USER_OBJECTS T WHERE T.OBJECT_TYPE = 'FUNCTION' AND T.STATUS = 'INVALID') Loop
        v_sql := 'ALTER FUNCTION '||y.object_name ||' COMPILE ';
        Begin
             EXECUTE IMMEDIATE v_sql;
        PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,SQL%ROWCOUNT);
        COMMIT;
        End;
       End Loop;
     -- 存储过程错误信息记录
  EXCEPTION
  WHEN OTHERS THEN

    v_errmsg := v_stepnum || '步出错:' || SQLERRM;
    PRC_LOG_WRT(v_date,v_prc,v_stepnum,v_sql,v_errmsg,-1);
    COMMIT;

END;


猜你喜欢

转载自sinianxue.iteye.com/blog/2089432