source

오라클 개체 종속성 루프

factcode 2023. 11. 5. 15:00
반응형

오라클 개체 종속성 루프

Oracle Database에서 프로젝트를 컴파일하려고 하면 문제가 발생합니다.좀 더 쉽게 설명하자면, 패키지 2개(유틸과 유형)와 뷰 1개(VIEW), 이렇게 3개의 객체가 있습니다.

패키지 UTILS가 패키지 유형에 정의된 유형을 사용하고 있습니다.패키지 유형은 해당 유형 중 하나에 VIEW를 기본으로 사용하고 있습니다.그리고 VIEW는 패키지 UTILS의 기능을 스크립트에 사용하고 있습니다.이러한 개체 중 하나를 변경하려고 하면 모든 것이 잘못된 상태이므로 컴파일할 수 없습니다.그래서 일종의 객체 의존성 루프가 생성됩니다.

이 문제를 해결할 수 있도록 도와주시기 바랍니다.

예를 들어, 아래 코드를 컴파일 할 방법은 없습니까?각각의 개체는 개별적으로 구문적으로 정확하지만, 어떻게 그것들이 모두 함께 컴파일될 수 있습니까?

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';

두 개의 보기에서 보기를 중단하는 경우 순환 종속성을 중단할 수 있습니다.

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를 두 개로 분할하는 것도 가능합니다.

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;
/

포장형과 %ROWTYPE은 사용을 자제하겠습니다.표준 SQL이 아니므로 Structured Type으로 대체할 수 있습니다.

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();

패키지나 뷰를 분할하지 않으려면 항상 먼저 뷰의 더미 버전을 만들고 패키지를 컴파일한 다음 "진짜" 뷰를 만들 수 있습니다.

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;

exec dbms_utility.compile_schema(user, false);

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

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

언급URL : https://stackoverflow.com/questions/18630962/oracle-object-dependency-loop

반응형