首页 > 开发 > 综合 > 正文

用DBMS_DDL包重编译PL/SQL对象

2024-07-21 02:08:42
字体:
来源:转载
供稿:网友
  • 网站运营seo文章大全
  • 提供全面的站长运营经验及seo技术!

  •  

    用dbms_ddl包重编译pl/sql对象

     



        本篇文章,我们将会看到怎样用dbms_ddl包中的alter_compile过程重新编译已存储在数据库的对象.

     

     alter_compile过程
     这个过程等价于如下语句
     alter procedure|function|package [<schema>.] <name> compile [body]
        语法
     dbms_ddl.alter_compile (
         type   varchar2,
        schema varchar2,
         name   varchar2);
     参数:

                 

    type

    数据库对象的类型.正确值如下:

    procedure –重编译指定的过程

    function –重编译指定的函数

    package -重编译指定的包头和包体

    package_body -重编译指定的包体

    trigger -重编译指定的触发器

    schema

     

    重编译对象的方案名称,若为null,则为当前方案名称(大小写敏感)

    name

     

    重编译对象的名称(大小写敏感)

          

         现在,如果想重编译一个程序,oracle首先会重编译被标识invalid的程序所依赖的所有对象.

     

     例1:
     编译myuser方案的access_rights过程:
     dbms_ddl.alter_compile('procedure','myuser','access_rights');

     

     例2:
     差不多每个实例中,pl/sql对象名称以大写方式存储,如果创建时指定一个双引号的对象名称,那么当编译时应指定同样的方式.


     如果指定不正确,则会报以下的错误
     sql> dbms_ddl.alter_compile('procedure','myuser','access_rights');
     begin dbms_ddl.alter_compile('procedure','myuser','access_rights'); end;
     *
     error at line 1:
     ora-20000: unable to compile procedure "myuser"."access_rights",
      insufficient privileges or does not exist
     ora-06512: at "sys.dbms_ddl", line 68
     ora-06512: at line 1

     因此如果你创建如下的对象:
     create or replace procedure "my_object" is
     begin
     ...
     得使用:
     dbms_ddl.alter_compile('procedure','myuser','my_object');

     也可以使用alter procedure <procedure name> compile命令来编译对象,用dbms_ddl包最大的优势在于可以在以后的程序或pl/sql中编译,这将拥有完全的灵活性以创建强有力的使用价值(请参照如下例子)

     

     例3:
     这个例子将获得所有无效的对象并且重新编译
     set termout on
     set serverout on
     declare
     cursor cur_invalid_objects is
     select object_name, object_type from user_objects where status='invalid';
     rec_columns cur_invalid_objects%rowtype;
     err_status numeric;
      begin
      dbms_output.enable(10000);
      open cur_invalid_objects;
      loop
      fetch cur_invalid_objects into rec_columns;
      exit when cur_invalid_objects%notfound;

      dbms_output.put_line
       ('recompiling ' || rec_columns.object_type || '  ' || rec_columns.object_name);
      dbms_ddl.alter_compile(rec_columns.object_type,null,rec_columns.object_name);
      end loop;
      close cur_invalid_objects;
      exception
      when others then
      begin
      err_status := sqlcode;
      dbms_output.put_line(' recompilation failed : ' || sqlerrm(err_status));
     
      if ( cur_invalid_objects%isopen) then
       close cur_invalid_objects;
      end if;
     
      exception when others then
      null;
     end;
     end;
     /


    总结:
      alter_compile可以代替手工而自动编译对象,查找那些无效的对象从而一个一个地编译.
    发表评论 共有条评论
    用户名: 密码:
    验证码: 匿名发表