массовая компиляция pl / sql процедур - PullRequest
1 голос
/ 17 марта 2011

У меня есть много пакетов, которые нужно было скомпилировать при переходе от разработки к производству или когда мы выпускаем запрос на изменение.

прямо сейчас, мы компилируем каждый из пакетов по одному, используя toad или sqldbx, есть ли способ, которым я могу написать пакетный файл с помощью команды sqlplus, чтобы я мог запускать все свои пакеты за один раз ... как * SQL

Ответы [ 7 ]

10 голосов
/ 17 марта 2011

Вы можете выполнить dbms_utility.compile_schema(user,false); для компиляции всех недопустимых объектов в вашей схеме сразу.

Вы можете прочитать об этой процедуре здесь в документации: http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/d_util.htm#ARPLS73226

С уважением,
Роб.

3 голосов
/ 17 марта 2011

Обычно, когда мы делаем много изменений в базе данных, которая делает недействительными множество объектов, самый простой способ перекомпилировать их - это запускать sqlplus "/ as sysdba" @?/rdbms/admin/utlrp Эта процедура становится умнее с каждым выпуском, а с 10g она использует планировщик Oracle для параллельной работы,Это, конечно, работает только с dba доступом к базе данных.Если вам этого не хватает, Роб ван Вейк ответит вам.

3 голосов
/ 17 марта 2011

Вы можете поместить все SQL в текстовый файл и выполнить это:

SQL >  @/path/script.sql

Вам просто нужно указать путь к исполняемому скрипту.

1 голос
/ 11 июня 2014

Заголовки пакетов сначала:

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

Тогда тела упаковки:

for i in $(ls *.hed); do sqlplus user/password @$i; done
1 голос
/ 26 мая 2013

Одним из способов решения этой проблемы является развертывание кода в правильном порядке.

Сами пакеты 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 ...;

Если в самом пакете не было изменений, то, разумеется, его вообще не нужно развертывать.

Соблюдение этих методов должно дать вам гораздо меньшенедопустимые объекты.

1 голос
/ 17 марта 2011

Мой подход заключается в том, чтобы скопировать все сценарии пакетов в каталог, а затем создать в этом каталоге один сценарий sql для загрузки всех пакетов, см. Пример ниже.

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

-- load package bodies
@@package1.pkb
@@package2.pkb
0 голосов
/ 17 марта 2011

вы можете использовать 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.

Youможно также посмотреть в пакет utl_recomp

...