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;

  • 相关阅读:
    366. Find Leaves of Binary Tree
    369. Plus One Linked List
    370. Range Addition
    411. Minimum Unique Word Abbreviation
    379. Design Phone Directory
    Permutation
    leetcode216-Combination Sum III
    百度star编程赛-练习1
    腾讯暑期实习生面试题
    素数筛选
  • 原文地址:https://www.cnblogs.com/hand-lzs/p/8523941.html
Copyright © 2011-2022 走看看