自动编译失效存储过程

CREATE OR REPLACE PROCEDURE PRC_COMPILE_INVALID
IS
  --/************************************************************************************
  -- 程序名称:    PRC_COMPILE_INVALID
  -- 功能描述:    每天编译失效的存储过程和失效的索引

  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='DBCHNADM' 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;    
     
     -- 存储过程错误信息记录
  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/1884397