zoukankan      html  css  js  c++  java
  • oracle 编译无效对象

    在数据库中,会存在一些无效的对象,导致这种现象的发生原因很多,其中最常见的就是数据库升级(例如修改了表的结构),迁移而引起。

    编译无效对象的方式:

    1 使用alter **** compile 语句进行编译 
      
    2 以SYSDBA用户,执行ORACLE_HOME/rdbms/admin/utlrp.sql 脚本 

    注:执行时数据库中最好不要有活动事物或DDL操作,否则极容易导致死锁的出现,另外,utlrp.sql 里面其实调用了$ORACLE_HOME/rdbms/admin/utlrcmp.sql来编译失效对象。
     这个脚本是对整个数据库中的对象进行重新编译的,一般都是在迁移或者升级之后运行该脚本。
    3 用DBMS_UTILITY包来进行编译. 

    注:ORACLE提供了自动编译的接口dbms_utility.compile_schema(user,false); 调用这个过程就会编译所有失效的过程、函数、触发器、包

    exec dbms_utility.compile_schema( 'SCOTT' )

     4 在SQL*plus中利用中间脚本编译 

    1)创建脚本reCompile.sql

    set heading off;
    set feedback off;
    set echo off;
    Set lines 999;

    Spool run_invalid.sql

    select 'ALTER ' || OBJECT_TYPE || ' ' || OWNER || '.' || OBJECT_NAME || ' COMPILE;'
    from dba_objects
    where status = 'INVALID'
    and OWNER = 'APPS'
    and object_type in ('PACKAGE','FUNCTION','PROCEDURE','TRIGGER','JAVA SOURCE','JAVA CLASS','VIEW','SYNONYM');
    select 'alter package ' || owner || '.' || object_name ||
    ' compile body;'
    from dba_objects
    where status = 'INVALID'
    and OWNER = 'APPS'
    and object_type in ('PACKAGE BODY');
    spool off;
    set heading on;
    set feedback on;
    set echo on;
    @run_invalid

    2)在SQL*Plus中执行

    格式:@文件所在本地路径/文件名 

    注:路径不能有中文

    SQL> @C:UsersAdministratorDesktopaq eCompile.sql;

    备注:运行脚本reCompile.sql的时候,会创建另一个脚本run_invalid,紧跟着执行该脚本,完成编译工作

    5 编写PL/SQL利用游标编译


    declare
    v_object_name user_objects.object_name%type;
    v_object_type user_objects.object_type%type;
    cursor cur is
    select t.object_name, t.object_type
    from user_objects t
    where t.status = 'INVALID'
    --and t.object_name like 'CUX%'
    and t.object_type in ('PROCEDURE',
    'FUNCTION',
    'TRIGGER',
    'VIEW',
    'SYNONYM',
    'JAVA SOURCE',
    'JAVA CLASS',
    'PACKAGE',
    'PACKAGE BODY');
    begin
    open cur;
    loop
    fetch cur
    into v_object_name, v_object_type;
    exit when cur%notfound;
    if v_object_type = 'PACKAGE BODY' then
    begin
    execute immediate 'alter package ' || ' ' || v_object_name ||
    ' Compile body';
    dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name ||
    '() 成功');
    exception
    when others then
    dbms_output.put_line('编译' || v_object_type || ' ' ||
    v_object_name || '()
    失败.' || sqlerrm);
    end;
    else
    begin
    execute immediate 'alter ' || v_object_type || ' ' || v_object_name ||
    ' Compile';
    dbms_output.put_line('编译' || v_object_type || ' ' || v_object_name ||
    '() 成功');
    exception
    when others then
    dbms_output.put_line('编译' || v_object_type || ' ' ||
    v_object_name || '()
    失败.' || sqlerrm);
    end;
    end if;
    end loop;
    close cur;
    end;

  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/hand-lzs/p/8523941.html
Copyright © 2011-2022 走看看