10

プロジェクトをOracle Databaseでコンパイルしようとすると、問題が発生します。簡単にするために、2 つのパッケージ (UTILS と TYPES) と 1 つのビュー (VIEW) の 3 つのオブジェクトがあります。

パッケージ UTILS は、パッケージ TYPES で定義されたタイプを使用しています。パッケージ TYPES は、そのタイプの 1 つのベースとして VIEW を使用しています。そして、VIEWはそのスクリプトでパッケージUTILSの関数を使用しています。これらのオブジェクトの 1 つに変更を加えようとすると、すべてが無効な状態にあるため、コンパイルできません。そのため、ある種のオブジェクト依存ループが作成されます。

この問題を解決するのを手伝ってください。

たとえば、以下のコードをコンパイルする方法はありますか? 各オブジェクトは個々に構文的に正しいですが、どうすればすべてを一緒にコンパイルできるのでしょうか?

create or replace package my_types is
   type type1 is table of number;
   type type2 is table of my_view%rowtype;
end;
/

create or replace package my_utils is
   function get_1 return number;
   procedure do_something(parameter my_types.type2);
end;
/

create or replace package body my_utils is
   function get_1 return number is
   begin
       return 1;
   end;

   procedure do_something(parameter my_types.type2) is
   begin
       null;
   end;
end;
/

create or replace force view my_view as
select * from dual
where 1 = my_utils.get_1();

exec dbms_utility.compile_schema(user, false);

select object_name from user_objects where status <> 'VALID';
4

3 に答える 3

3

2 つのビューでビューを分割すると、循環依存を解除できます。

create or replace view my_view_1
as select * from dual; 

create or replace package my_types is
   type type1 is table of number;
   type type2 is table of my_view_1%rowtype;
end;
/

create or replace package my_utils is
   function get_1 return number;
   procedure do_something(parameter my_types.type2);
end;
/

create or replace package body my_utils is
   function get_1 return number is
   begin
       return 1;
   end;

   procedure do_something(parameter my_types.type2) is
   begin
       null;
   end;
end;
/

create or replace view my_view as
select * from my_view_1
where 1 = my_utils.get_1();

編集: 別の可能性は、パッケージ my_utils を 2 つに分割することです。

create or replace package my_utils_1 is
   function get_1 return number;
end;
/
create or replace package body my_utils_1 is
   function get_1 return number is
   begin
       return 1;
   end;
end;
/

create or replace view my_view as
select * from dual
where 1 = my_utils_1.get_1();

create or replace package my_types is
   type type1 is table of number;
   type type2 is table of my_view%rowtype;
end;
/

create or replace package my_utils_2 is
   procedure do_something(parameter my_types.type2);
end;
/
create or replace package body my_utils_2 is
   procedure do_something(parameter my_types.type2) is
   begin
       null;
   end;
end;
/
于 2013-09-10T22:40:32.097 に答える
2

パッケージ化された型と %ROWTYPE の使用は控えたいと思います。これらは標準 SQL ではなく、構造化型に置き換えることができます

create or replace view my_view_1
as select * from dual; 

create or replace type type1 as table of number;
create or replace type type2 as object (DUMMY VARCHAR2(1 byte));
create or replace type table_type2 as table of type2;

create or replace package my_utils is
   function get_1 return number;
   procedure do_something(parameter table_type2);
end;
/

create or replace package body my_utils is
   function get_1 return number is
   begin
       return 1;
   end;

   procedure do_something(parameter table_type2) is
   begin
       null;
   end;
end;
/

create or replace view my_view as
select * from my_view_1
where 1 = my_utils.get_1();
于 2013-09-12T13:08:29.180 に答える