【发布时间】:2011-07-17 03:56:59
【问题描述】:
当我从开发转移到生产或发布更改请求时,我有很多需要编译的包。
现在,我们使用 toad 或 sqldbx 一个一个地编译每个包,有没有一种方法可以使用 sqlplus 命令编写一个批处理文件,这样我就可以一次运行我的所有包.. 像 *. sql
【问题讨论】:
标签: oracle plsql package compilation
当我从开发转移到生产或发布更改请求时,我有很多需要编译的包。
现在,我们使用 toad 或 sqldbx 一个一个地编译每个包,有没有一种方法可以使用 sqlplus 命令编写一个批处理文件,这样我就可以一次运行我的所有包.. 像 *. sql
【问题讨论】:
标签: oracle plsql package compilation
包头优先:
for i in $(ls *.hed); do sqlplus user/password @$i; done
然后是包体:
for i in $(ls *.hed); do sqlplus user/password @$i; done
【讨论】:
解决此问题的一种方法是以正确的顺序部署您的代码。
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 ...;
如果包本身没有变化,那么当然根本不需要部署它。
尊重这些方法应该可以减少无效对象。
【讨论】:
您可以执行dbms_utility.compile_schema(user,false); 一次编译架构中的所有无效对象。
您可以在文档中阅读有关该过程的信息:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_util.htm#ARPLS73226
问候,
抢。
【讨论】:
您可以将所有 SQL 放在一个文本文件中并通过以下方式执行:
SQL > @/path/script.sql
您只需要提供要执行的脚本的路径。
【讨论】:
您可以使用 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 包
【讨论】:
通常,当我们在使大量对象无效的数据库中进行大量更改时,重新编译它们的最简单方法是运行sqlplus "/ as sysdba" @?/rdbms/admin/utlrp 这个过程在每个版本都变得更加智能,并且从 10g 开始,它使用 Oracle 调度程序并行工作.这当然只适用于对数据库的 dba 访问。如果您缺少 Rob van Wijk 的答案,那么您就是要走的路。
【讨论】:
我的方法是将所有包脚本复制到一个目录中,然后在该目录中创建一个 sql 脚本来加载所有包,请参见下面的示例。
-- load package specifications
@@package1.pks
@@package2.pks
-- load package bodies
@@package1.pkb
@@package2.pkb
【讨论】: