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

64次阅读
没有评论

共计 3517 个字符,预计需要花费 9 分钟才能阅读完成。

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

--------------------------------------------------------
-- 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;
/

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

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-20发表,共计3517字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)