반응형
오라클 개체 종속성 루프
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
반응형
'source' 카테고리의 다른 글
pandas를 만듭니다.사전에서 데이터프레임 (0) | 2023.11.05 |
---|---|
ORA-04036: 인스턴스에서 사용하는 PGA 메모리가 PGA_AGGRATE_LIMIT를 초과합니다. (0) | 2023.11.05 |
MySQL GUID/UUID 저장 (0) | 2023.11.05 |
다른 필드의 COUNT가 SQL인 열을 업데이트하시겠습니까? (0) | 2023.11.05 |
도커 구성품 단일 컨테이너 구축 (0) | 2023.11.05 |