数据库中失效对象编译的方法教程

发布时间:2021-11-11 11:11:57 作者:iii
来源:亿速云 阅读:114

本篇内容介绍了“数据库中失效对象编译的方法教程”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

--------------------------------------------------------
--  DDL for Table RECOMPILE_LOG
--------------------------------------------------------
  CREATE TABLE "RECOMPILE_LOG" 
   (    "RDATE" DATE, 
    "ERRMSG" VARCHAR2(200 BYTE)
   ) ;
--------------------------------------------------------
--  DDL for Table RECOMPILE_TYPE_INFO
--------------------------------------------------------
  CREATE TABLE "RECOMPILE_TYPE_INFO" 
   (    "TYPE" VARCHAR2(30 BYTE), 
    "PROCESS_MODE" VARCHAR2(30 BYTE), 
    "BASE_TABLE" VARCHAR2(30 BYTE)
   ) ;
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('TRIGGER','COMPILE','DBA_DEPENDENCIES');
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('PROCEDURE','COMPILE','DBA_DEPENDENCIES');
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('FUNCTION','COMPILE','DBA_DEPENDENCIES');
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('PACKAGE','COMPILE','DBA_DEPENDENCIES');
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('TYPE','COMPILE','DBA_DEPENDENCIES');
Insert into EODA.RECOMPILE_TYPE_INFO (TYPE,PROCESS_MODE,BASE_TABLE) values ('INDEX','REBUILD ONLINE','DBA_INDEXES');
--------------------------------------------------------
--  DDL for Procedure RECOMPILE_OBJECTS
--------------------------------------------------------
set define off;
  CREATE OR REPLACE EDITIONABLE PROCEDURE "RECOMPILE_OBJECTS" (RIO_OWNER       VARCHAR2,
                                              RIO_OBJECT_NAME VARCHAR2) AS
  COMPILE_SQL   VARCHAR2(500);
  P_OWNER       VARCHAR2(30) := UPPER(RIO_OWNER);
  P_OBJECT_NAME VARCHAR2(30) := UPPER(RIO_OBJECT_NAME);
BEGIN
  FOR RIO_TYPE IN (SELECT TYPE, PROCESS_MODE, BASE_TABLE
                     FROM RECOMPILE_TYPE_INFO) LOOP
    IF RIO_TYPE.BASE_TABLE = 'DBA_DEPENDENCIES' THEN
      FOR DBA_DEP IN (SELECT OWNER, NAME
                        FROM DBA_DEPENDENCIES
                       WHERE TYPE = RIO_TYPE.TYPE
                         AND REFERENCED_OWNER = P_OWNER
                         AND REFERENCED_NAME = P_OBJECT_NAME) LOOP
        FOR DBA_OBJ IN (SELECT STATUS
                          FROM DBA_OBJECTS
                         WHERE OWNER = DBA_DEP.OWNER
                           AND OBJECT_NAME = DBA_DEP.NAME) LOOP
          IF DBA_OBJ.STATUS = 'INVALID' THEN
            BEGIN
              COMPILE_SQL := 'ALTER ' || RIO_TYPE.TYPE || ' ' ||
                             DBA_DEP.OWNER || '.' || DBA_DEP.NAME || ' ' ||
                             RIO_TYPE.PROCESS_MODE;
              EXECUTE immediate COMPILE_SQL;
            EXCEPTION
              WHEN OTHERS THEN
                INSERT INTO recompile_log
                  (rdate, errmsg)
                VALUES
                  (sysdate, COMPILE_SQL);
            END;
          END IF;
        END LOOP;
      END LOOP;
    END IF;
    IF RIO_TYPE.BASE_TABLE = 'DBA_INDEXES' THEN
      FOR DBA_IND IN (SELECT OWNER, INDEX_NAME, PARTITIONED, STATUS
                        FROM DBA_INDEXES
                       WHERE TABLE_OWNER = P_OWNER
                         AND TABLE_NAME = P_OBJECT_NAME) LOOP
        IF DBA_IND.PARTITIONED = 'NO' AND DBA_IND.STATUS = 'INVALID' THEN
          BEGIN
            COMPILE_SQL := 'ALTER ' || RIO_TYPE.TYPE || ' ' ||
                           DBA_IND.OWNER || '.' || DBA_IND.INDEX_NAME || ' ' ||
                           RIO_TYPE.PROCESS_MODE;
            EXECUTE immediate COMPILE_SQL;
          EXCEPTION
            WHEN OTHERS THEN
              INSERT INTO recompile_log
                (rdate, errmsg)
              VALUES
                (sysdate, COMPILE_SQL);
          END;
        END IF;
        IF DBA_IND.PARTITIONED = 'YES' THEN
          FOR IND_PAR IN (SELECT PARTITION_NAME, STATUS
                            FROM DBA_IND_PARTITIONS
                           WHERE INDEX_OWNER = DBA_IND.OWNER
                             AND INDEX_NAME = DBA_IND.INDEX_NAME) LOOP
            IF IND_PAR.STATUS = 'UNUSABLE' THEN
              BEGIN
                COMPILE_SQL := 'ALTER ' || RIO_TYPE.TYPE || ' ' ||
                               DBA_IND.OWNER || '.' || DBA_IND.INDEX_NAME ||
                               ' PARTITION ' || IND_PAR.PARTITION_NAME ||
                               ' ONLINE';
                EXECUTE immediate COMPILE_SQL;
              EXCEPTION
                WHEN OTHERS THEN
                  INSERT INTO recompile_log
                    (rdate, errmsg)
                  VALUES
                    (sysdate, COMPILE_SQL);
              END;
            END IF;
          END LOOP;
        END IF;
      END LOOP;
    END IF;
  END LOOP;
END;
/

“数据库中失效对象编译的方法教程”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!

推荐阅读:
  1. 在ORACLE中找出并批量编译失效的对象
  2. 包失效,无法编译

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

数据库

上一篇:PatterNodes for Mac创建图形矢量模式工具有什么用

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》