【问题标题】:bulk compiling pl/sql procedures批量编译 pl/sql 过程
【发布时间】:2011-07-17 03:56:59
【问题描述】:

当我从开发转移到生产或发布更改请求时,我有很多需要编译的包。

现在,我们使用 toad 或 sqldbx 一个一个地编译每个包,有没有一种方法可以使用 sqlplus 命令编写一个批处理文件,这样我就可以一次运行我的所有包.. 像 *. sql

【问题讨论】:

    标签: oracle plsql package compilation


    【解决方案1】:

    包头优先:

    for i in $(ls *.hed); do sqlplus user/password @$i; done
    

    然后是包体:

    for i in $(ls *.hed); do sqlplus user/password @$i; done
    

    【讨论】:

      【解决方案2】:

      解决此问题的一种方法是以正确的顺序部署您的代码。

      PL/SQL 包本身就是包体中代码的API,包本身不相互依赖。然而,包体可能依赖于包,因此如果重新编译一个包,则存在使引用它的包体失效的风险。

      不幸的是,以这种顺序运行的部署很常见:

      create or replace Package A ...;
      create or replace Package Body A ...;
      create or replace Package B ...;
      create or replace Package Body B ...;
      create or replace Package C ...;
      create or replace Package Body C ...;
      

      如果包体 A 中的代码依赖于包 B,那么当包 B 被(重新)创建时,它会使包体 A 无效。

      正确的部署顺序是:

      create or replace Package A ...;
      create or replace Package B ...;
      create or replace Package C ...;
      create or replace Package Body A ...;
      create or replace Package Body B ...;
      create or replace Package Body C ...;
      

      如果包本身没有变化,那么当然根本不需要部署它。

      尊重这些方法应该可以减少无效对象。

      【讨论】:

      • 一个包可以依赖于另一个包,例如,如果它引用了另一个包规范中声明的类型。
      • 是的,当然。我认为这强调了在包体之前打包代码和编译包的重要性,除非您考虑不同的问题?
      【解决方案3】:

      您可以执行dbms_utility.compile_schema(user,false); 一次编译架构中的所有无效对象。

      您可以在文档中阅读有关该过程的信息:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_util.htm#ARPLS73226

      问候,
      抢。

      【讨论】:

        【解决方案4】:

        您可以将所有 SQL 放在一个文本文件中并通过以下方式执行:

        SQL >  @/path/script.sql
        

        您只需要提供要执行的脚本的路径。

        【讨论】:

          【解决方案5】:

          您可以使用 dba_objects 检查无效对象并使用动态 sql 生成编译语句,例如:

          select 'alter ' || object_type || ' ' || owner || '.' || object_name || ' compile;'
          from dba_objects
          where status = 'INVALID'
          and object_type in ('PACKAGE', 'PROCEDURE', 'FUNCTION');
          

          然后您可以将其放入 sql 脚本中。

          你也可以看看 utl_recomp 包

          【讨论】:

            【解决方案6】:

            通常,当我们在使大量对象无效的数据库中进行大量更改时,重新编译它们的最简单方法是运行sqlplus "/ as sysdba" @?/rdbms/admin/utlrp 这个过程在每个版本都变得更加智能,并且从 10g 开始,它使用 Oracle 调度程序并行工作.这当然只适用于对数据库的 dba 访问。如果您缺少 Rob van Wijk 的答案,那么您就是要走的路。

            【讨论】:

              【解决方案7】:

              我的方法是将所有包脚本复制到一个目录中,然后在该目录中创建一个 sql 脚本来加载所有包,请参见下面的示例。

              -- load package specifications
              @@package1.pks
              @@package2.pks
              
              -- load package bodies
              @@package1.pkb
              @@package2.pkb
              

              【讨论】:

                猜你喜欢
                • 2020-10-23
                • 1970-01-01
                • 1970-01-01
                • 2015-10-31
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-12-12
                • 2015-02-10
                相关资源
                最近更新 更多