2011-03-17 76 views
1

当我从开发移植到生产或者当我们发布更改请求时,我有很多需要编译的软件包。批量编译pl/sql程序

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

回答

3

你可以把所有这些SQL文本文件并执行,通过:

SQL > @/path/script.sql 

你只需要提供脚本的路径将被执行。

1

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

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

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

正常情况下,当我们在数据库中进行大量更改以使大量对象无效时,最简单的方法是通过运行sqlplus "/ as sysdba" @?/rdbms/admin/utlrp该过程在每个发行版中变得更加明智,并使用Oracle调度程序从10g并行工作。这当然只适用于dba访问数据库。如果你缺乏Rob van Wijk的答案,那就走。

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包解决这是正确的顺序部署代码的

+1

任何理由为近期downvote ...? – tbone 2013-09-29 18:23:19

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

这样做的副作用是,如果在封装体上的代码依赖于程序包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 ...; 

如果还没有在包装本身的变化则日当然,根本不需要部署它。

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

+0

一个包可以依赖于另一个包,例如,如果它引用在另一个包spec中声明的类型。 – 2015-11-11 23:57:49

+0

是的,绝对。我认为这强调了在包体之前打包代码和编译包的重要性,除非你想到另一个问题? – 2015-11-12 12:22:38

1

软件包头第一:

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

接包机构:

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