当我从开发移植到生产或者当我们发布更改请求时,我有很多需要编译的软件包。批量编译pl/sql程序
现在,我们使用toad或sqldbx逐一编译每个软件包,有没有一种方法可以使用sqlplus命令编写批处理文件,以便我可以一次运行所有软件包..就像* .SQL
当我从开发移植到生产或者当我们发布更改请求时,我有很多需要编译的软件包。批量编译pl/sql程序
现在,我们使用toad或sqldbx逐一编译每个软件包,有没有一种方法可以使用sqlplus命令编写批处理文件,以便我可以一次运行所有软件包..就像* .SQL
你可以把所有这些SQL文本文件并执行,通过:
SQL > @/path/script.sql
你只需要提供脚本的路径将被执行。
我的方法是将所有包脚本复制到一个目录中,然后在该目录中创建一个单独的sql脚本来加载所有包,请参阅下面的示例。
-- load package specifications
@@package1.pks
@@package2.pks
-- load package bodies
@@package1.pkb
@@package2.pkb
可以执行dbms_utility.compile_schema(user,false);
编译模式中的所有无效对象一次。
您可以在文档中读到这里有关程序:http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_util.htm#ARPLS73226
问候,
罗布。
正常情况下,当我们在数据库中进行大量更改以使大量对象无效时,最简单的方法是通过运行sqlplus "/ as sysdba" @?/rdbms/admin/utlrp
该过程在每个发行版中变得更加明智,并使用Oracle调度程序从10g并行工作。这当然只适用于dba访问数据库。如果你缺乏Rob van Wijk的答案,那就走。
可以使用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包解决这是正确的顺序部署代码的
的一种方式。
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 ...;
如果还没有在包装本身的变化则日当然,根本不需要部署它。
尊重这些方法应该给你更少的无效对象。
一个包可以依赖于另一个包,例如,如果它引用在另一个包spec中声明的类型。 – 2015-11-11 23:57:49
是的,绝对。我认为这强调了在包体之前打包代码和编译包的重要性,除非你想到另一个问题? – 2015-11-12 12:22:38
软件包头第一:
for i in $(ls *.hed); do sqlplus user/password @$i; done
接包机构:
for i in $(ls *.hed); do sqlplus user/password @$i; done
任何理由为近期downvote ...? – tbone 2013-09-29 18:23:19