批量编译pl / sql程序

时间:2011-03-17 05:55:25

标签: oracle plsql package compilation

当我从开发阶段转向生产阶段或发布变更请求时,我有很多需要编译的软件包。

现在,我们使用toad或sqldbx逐个编译每个软件包,有没有办法可以用sqlplus命令编写批处理文件,这样我就可以一次性运行所有软件包..就像*一样。 SQL

7 个答案:

答案 0 :(得分:10)

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

您可以在文档中了解该程序:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_util.htm#ARPLS73226

的问候,
罗布。

答案 1 :(得分:3)

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

SQL >  @/path/script.sql

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

答案 2 :(得分:3)

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

答案 3 :(得分:1)

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

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

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

答案 4 :(得分:1)

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

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 ...;

这有副作用,如果Package Body A中的代码依赖于Package B,那么当(重新)创建Package B时,它会使Package Body 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 ...;

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

尊重这些方法应该会减少更少的无效对象。

答案 5 :(得分:1)

首先打包标题:

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

然后包体:

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

答案 6 :(得分:0)

您可以使用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包