暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

DBA命令速查4:Oracle 编译无效对象(Compile Invalid Objects)

1637

编者按:留存一下供自己需要时查找。

【免责声明】本公众号文章仅代表个人观点,与任何公司无关,仅供参考。


编辑|SQL和数据库技术(ID:SQLplusDB)

查看无效对象

例1:

    SQL> SET LINES 333 PAGES 111
    SQL> COL OBJECT_NAME FOR A40
    SQL> COL OBJECT_TYPE FOR A30
    SQL> COL OWNER FOR A25
    SQL> SELECT OWNER, OBJECT_TYPE,COUNT(*) OBJECT_COUNT FROM DBA_OBJECTS WHERE STATUS <> 'VALID'
    2 GROUP BY OWNER,OBJECT_TYPE order by OWNER,OBJECT_TYPE;


    OWNER OBJECT_TYPE OBJECT_COUNT
    ------------------------- ------------------------------ ------------
    TEST PROCEDURE 1
    TESTC100 FUNCTION 2
    复制

    例2:

      SQL> SET LINES 333 PAGES 111
      SQL> COL OBJECT_NAME FOR A40
      SQL> COL OBJECT_TYPE FOR A30
      SQL> SELECT OWNER, OBJECT_NAME,OBJECT_TYPE FROM DBA_OBJECTS
      2 WHERE STATUS <> 'VALID' ORDER BY OWNER, OBJECT_NAME;


      OWNER OBJECT_NAME OBJECT_TYPE
      ------------------------- ---------------------------------------- ------------------------------
      TEST DO_CURSORS PROCEDURE
      TESTC100 DEBUG_VERSION_RPT FUNCTION
      TESTC100 VERSION_RPT FUNCTION
      复制

      查看某对象的依赖关系对象:

        SELECT * FROM DBA_DEPENDENCIES WHERE NAME='&OBJECTNAME';
        复制

        编译个别对象:

        例:



          --编译程序包
          ALTER PACKAGE package_name COMPILE;


          ---分别编译程序包PACKAGE和BODY
          ALTER PACKAGE package_name COMPILE PACKAGE;
          ALTER PACKAGE package_name COMPILE BODY;


          --编译视图和触发器
          ALTER VIEW <SCHEMA NAME>.<VIEW_NAME> COMPILE;
          ALTER TRIGGER <SCHEMA).<TRIGGER_NAME> COMPILE;


          --查看是否有编译错误
          show errors
          复制

          PL/SQL生成脚本编译所有无效用户对象

          例1:

            --编译所有无效PROCEDURE对象


            BEGIN
            FOR cur IN (
            SELECT
            object_name
            ,object_type
            FROM dba_objects
            WHERE object_type = 'PROCEDURE'
            AND status = 'INVALID'
            )
            LOOP
            DBMS_OUTPUT.PUT_LINE(cur.object_name);
            EXECUTE IMMEDIATE 'ALTER ' || cur.object_type || ' ' || cur.object_name || ' COMPILE';
            END LOOP;
            END;
            /
            复制

            例2:

              --生成手动编译无效对象的脚本,然后执行脚本。
              SELECT 'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;'
              FROM DBA_OBJECTS WHERE STATUS = 'INVALID' AND
              OBJECT_TYPE IN ('PACKAGE','PACKAGE BODY','FUNCTION','PROCEDURE','TRIGGER','VIEW','SYNONYM','JAVA SOURCE','JAVA CLASS');
              复制

              utlrp.sql and utlprp.sql脚本编译数据库失效对象

              Oracle提供了utlrp.sql和utlprp.sql脚本来重新编译数据库中的所有无效对象,

              例:

                @$ORACLE_HOME/rdbms/admin/utlrp.sql
                @$ORACLE_HOME/rdbms/admin/utlprp.sql
                复制

                DBMS_UTILITY.compile_schema编译数据库失效对象

                DBMS_UTILITY包中的COMPILE_SCHEMA过程编译指定模式中的所有过程,函数,包和触发器。

                例:

                  EXEC DBMS_UTILITY.compile_schema(schema => 'SCOTT', compile_all => false);
                  复制

                  UTL_RECOMP包编译数据库失效对象

                  UTL_RECOMP包中包含两个用于重新编译无效对象的过程。 

                  RECOMP_SERIAL过程一次重新编译所有无效对象,而RECOMP_PARALLEL过程使用指定数量的线程并行执行相同的任务。 

                  例:

                    -- Schema level.
                    EXEC UTL_RECOMP.recomp_serial('SCOTT');
                    EXEC UTL_RECOMP.recomp_parallel(4, 'SCOTT');


                    -- Database level.
                    EXEC UTL_RECOMP.recomp_serial();
                    EXEC UTL_RECOMP.recomp_parallel(4);


                    -- Using job_queue_processes value.
                    EXEC UTL_RECOMP.recomp_parallel();
                    EXEC UTL_RECOMP.recomp_parallel(NULL, 'SCOTT');
                    复制

                    参考:

                      PL/SQL Packages and Types Reference
                      https://docs.oracle.com/en/database/oracle/oracle-database/21/arpls/UTL_RECOMP.html
                      >275 UTL_RECOMP
                      复制

                      其他参考

                        https://oracle-base.com/articles/misc/recompiling-invalid-schema-objects
                        Recompiling Invalid Schema Objects


                        Oracle オブジェクトを一括で再コンパイルする方法
                        https://www.saka-en.com/oracle/oracle-recompile-bulk/
                        复制

                        Hands On:(常用命令&小技巧)

                        手动创建数据库及创建过程遇到的错误(踩到的坑)

                        数据库管理和维护常用操作和命令

                        RMAN相关基础操作

                        【常用命令】修改数据库字符集(仅供测试使用)

                        【常用命令】监视数据库的用户登录和注销会话信息

                        【常用命令】自动统计收集的停止(无效)和启动(有效)

                        【常用命令】获取数据库对象的定义(DDL)

                        【常用命令】修改数据库字符集(仅供测试使用)

                        【怎么办001】DROP USER ... CASCADE特别慢怎么办?

                        【怎么办002】想要获取数据库对象的定义(DDL)怎么办

                        【怎么办】003 如何加强Oracle数据库安全--监控数据导入导出操作

                        【怎么办】004 如何找到删库跑路的人--监控数据库用户登录

                        SQL*PLUS技巧:生成易读的HTML报表【快问快答】如何判断OJVM是否被使用?【快问快答】如何收集回看sql语句中传入的绑定变量值

                        【快问快答】事务异常或者instance abort时,如何估算事务rollback时间

                        使用PL/SQL发邮件相关的Oracle ACL (Access Control List)

                        DBA命令速查1:查看SQL的执行计划

                        DBA命令速查2:查看隐含参数值

                        DBA命令速查3:获取Oracle服务器IP的方法

                        文章转载自Oracle数据库技术,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论