当我从开发阶段转向生产阶段或发布变更请求时,我有很多需要编译的软件包。
现在,我们使用toad或sqldbx逐个编译每个软件包,有没有办法可以用sqlplus命令编写批处理文件,这样我就可以一次性运行所有软件包..就像*一样。 SQL
答案 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包