Если вы действительно имеете дело только с PL / SQL-пакетами, вам не нужно беспокоиться о порядке сборки. Сначала создайте все спецификации пакета. Затем вы можете развернуть все тела пакета, и они скомпилируют, потому что их зависимости - это спецификации пакета.
Если у вас есть какие-то спецификации пакетов, которые зависят от других спецификаций - если у вас есть пакеты, которые объявляют, скажем, константы, подтипы или ref-курсоры, которые используются в сигнатурах пакетных процедур - тогда вам нужно собрать этот пакет спецификации в первую очередь. Но их должно быть достаточно, чтобы вы могли упорядочить их в сценарии сборки вручную.
редактировать
Похоже, они будут делать
инкрементные и "чистые" сборки,
поэтому порядок сборки будет иметь наибольшее значение
когда они очищают
окружающей среды и восстановить его.
Это ничего не меняет.
Вот расширенный пример. У меня есть схема с тремя пакетами ....
SQL> select object_name, object_type, status
2 from user_objects
3 order by 1, 2
4 /
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- -------
PKG1 PACKAGE VALID
PKG1 PACKAGE BODY VALID
PKG2 PACKAGE VALID
PKG2 PACKAGE BODY VALID
PKG3 PACKAGE VALID
PKG3 PACKAGE BODY VALID
6 rows selected.
SQL>
Интересно, что процедура в PKG1 вызывает процедуру из PKG2, процедура в PKG2 вызывает процедуру из PKG3, а процедура в PKG3 вызывает процедуру из PKG1.
Q. Как работает эта круговая зависимость?
A. Это не круговая зависимость ....
SQL> select name, type, referenced_name, referenced_type
2 from user_dependencies
3 where referenced_owner = user
4 /
NAME TYPE REFERENCED_NAME REFERENCED_TYPE
--------------- --------------- --------------- ---------------
PKG1 PACKAGE BODY PKG1 PACKAGE
PKG1 PACKAGE BODY PKG2 PACKAGE
PKG2 PACKAGE BODY PKG2 PACKAGE
PKG2 PACKAGE BODY PKG3 PACKAGE
PKG3 PACKAGE BODY PKG3 PACKAGE
PKG3 PACKAGE BODY PKG1 PACKAGE
6 rows selected.
SQL>
Все зависимые объекты являются телами пакетов, все ссылочные объекты являются упакованными спецификациями. Следовательно, если я создаю схему, это действительно не имеет значения, какой порядок я использую. Сначала мы мусор ...
SQL> drop package pkg1
2 /
Package dropped.
SQL> drop package pkg2
2 /
Package dropped.
SQL> drop package pkg3
2 /
Package dropped.
SQL>
Тогда мы перестроим ...
SQL> create or replace package pkg3 is
2 procedure p5;
3 procedure p6;
4 end pkg3;
5 /
Package created.
SQL> create or replace package pkg2 is
2 procedure p3;
3 procedure p4;
4 end pkg2;
5 /
Package created.
SQL> create or replace package pkg1 is
2 procedure p1;
3 procedure p2;
4 end pkg1;
5 /
Package created.
SQL> create or replace package body pkg2 is
2 procedure p3 is
3 begin
4 pkg3.p5;
5 end p3;
6 procedure p4 is
7 begin
8 dbms_output.put_line('PKG2.P4');
9 end p4;
10 end pkg2;
11 /
Package body created.
SQL> create or replace package body pkg3 is
2 procedure p5 is
3 begin
4 dbms_output.put_line('PKG3.P5');
5 end p5;
6 procedure p6 is
7 begin
8 pkg1.p1;
9 end p6;
10 end pkg3;
11 /
Package body created.
SQL> create or replace package body pkg1 is
2 procedure p1 is
3 begin
4 dbms_output.put_line('PKG1.P1');
5 end p1;
6 procedure p2 is
7 begin
8 pkg2.p4;
9 end p2;
10 end pkg1;
11 /
Package body created.
SQL>
Порядок отдельных объектов не имеет значения. Просто создайте спецификации пакета перед телом пакета. Хотя даже это не имеет большого значения ...
SQL> create or replace package pkg4 is
2 procedure p7;
3 end pkg4;
4 /
Package created.
SQL> create or replace package body pkg4 is
2 procedure p7 is
3 begin
4 dbms_output.put_line('PKG4.P7::'||constants_pkg.whatever);
5 end p7;
6 end pkg4;
7 /
Warning: Package Body created with compilation errors.
SQL> show errors
Errors for PACKAGE BODY PKG4:
LINE/COL ERROR
-------- -----------------------------------------------------------------
4/9 PL/SQL: Statement ignored
4/43 PLS-00201: identifier 'CONSTANTS_PKG.WHATEVER' must be declared
SQL>
PKG4
НЕВЕРНО, потому что мы еще не построили CONSTANTS_PKG
.
SQL> create or replace package constants_pkg is
2 whatever constant varchar2(20) := 'WHATEVER';
3 end constants_pkg;
4 /
Package created.
SQL> select object_name, object_type, status
2 from user_objects
3 where status != 'VALID'
4 order by 1, 2
5 /
OBJECT_NAME OBJECT_TYPE STATUS
--------------- --------------- -------
PKG4 PACKAGE BODY INVALID
SQL>
SQL> set serveroutput on size unlimited
SQL> exec pkg4.p7
PKG4.P7::WHATEVER
PL/SQL procedure successfully completed.
SQL> select object_name, object_type, status
2 from user_objects
3 where status != 'VALID'
4 order by 1, 2
5 /
no rows selected
SQL>
Все, что построено с использованием CREATE OR REPLACE
, всегда создается, оно просто помечается как НЕДЕЙСТВИТЕЛЬНОЕ, если есть ошибки. Как только мы выполняем это, прямо или косвенно, база данных компилирует это для нас. Итак, порядок не имеет значения. На самом деле это не так.
Если идея завершения сборки с недопустимыми объектами касается вас - и у меня есть некоторое сочувствие по этому поводу, нам сказали не жить с разбитыми окнами - вы можете использовать скрипт utlrp
или в 11g UTL_RECOMP пакет ; В любом случае требуется учетная запись SYSDBA.
редактировать 2
Процесс основан на сборке
инструмент, который был построен продавцом
продукт, с которым мы интегрируемся,
Именно поэтому единственные входы, которые я могу
дать процессу сборки список
файлов в том порядке, в котором они должны быть
встроенный. Если есть компилятор
ошибка, инструмент сборки не работает, у нас есть
вручную подать запрос на новый
строить.
Это политическая проблема, а не техническая. Это не означает, что политические проблемы не могут быть решены с помощью технического исправления, просто это техническое исправление не лучший инструмент для работы. Удачи.