- 테스트 준비
--impact on the function when adding/altering orginal table
create or replace function get_cust_name
( p_cust_id number)
return varchar2
is
v_name customer.name%type;
begin
select name into v_name
from customer
where cust_id=p_cust_id;
exception
when others then return null;
end;
-- 현재 모든 객체는 정상
select object_name, object_type, created, status
from user_objects
where lower(object_name) in ('customer','v_customer','v2_customer','get_cust_name');
/*
OBJECT_NAME OBJECT_TYPE CREATED STATUS
------------------------------ ----------------------- --------- -------
CUSTOMER TABLE 17-MAY-24 VALID
GET_CUST_NAME FUNCTION 17-MAY-24 VALID
V2_CUSTOMER VIEW 17-MAY-24 VALID
V_CUSTOMER VIEW 17-MAY-24 VALID
*/
- 컬럼추가 - 함수의 상태는 비정상으로 변경됨
--adding col to a table will invalidate the function
-- 테이블에 필드를 하나 추가
alter table customer add( location number);
-- 함수의 상태가 비정상으로 변경됨
select object_name, object_type, created, status
from user_objects
where lower(object_name) in ('customer','v_customer','v2_customer','get_cust_name');
/*
OBJECT_NAME OBJECT_TYPE CREATED STATUS
------------------------------ ----------------------- --------- -------
CUSTOMER TABLE 17-MAY-24 VALID
GET_CUST_NAME FUNCTION 17-MAY-24 INVALID*******
V2_CUSTOMER VIEW 17-MAY-24 VALID
V_CUSTOMER VIEW 17-MAY-24 VALID
*/
--but when you run it, it will compile it again
-- 함수를 실행하면 컴파일이 자동으로 다시 실행된다
select get_cust_name(10) from dual;
/*
GET_CUST_NAME(10)
----------------------
*/
-- 함수의 상태는 다시 정상으로 변경됨
select object_name, object_type, created, status
from user_objects
where lower(object_name) in ('customer','v_customer','v2_customer','get_cust_name');
/*
OBJECT_NAME OBJECT_TYPE CREATED STATUS
------------------------------ ----------------------- --------- -------
CUSTOMER TABLE 17-MAY-24 VALID
GET_CUST_NAME FUNCTION 17-MAY-24 VALID
V2_CUSTOMER VIEW 17-MAY-24 VALID
V_CUSTOMER VIEW 17-MAY-24 VALID
*/
- 컬럼 수정 - 함수와 관련 유무에 따라서 영향을 미침
--alter col in table may or may not invalidate the function
--관련있는 컬럼을 변경하면 함수의 상태는 비정상으로 변하고, 관련없는 컬럼을 변경하면 아무 영향이 없다
alter table customer modify tel varchar2(300);
--함수랑 관련없지만 뷰와 관련이 있는 컬럼이 변경되므로 뷰의 상태만 비정상으로 변경
select object_name, object_type, created, status
from user_objects
where lower(object_name) in ('customer','v_customer','v2_customer','get_cust_name');
/*
OBJECT_NAME OBJECT_TYPE CREATED STATUS
------------------------------ ----------------------- --------- -------
CUSTOMER TABLE 17-MAY-24 VALID
GET_CUST_NAME FUNCTION 17-MAY-24 VALID
V2_CUSTOMER VIEW 17-MAY-24 INVALID
V_CUSTOMER VIEW 17-MAY-24 VALID
*/
select * from V2_CUSTOMER;
-- 상기 쿼리를 실행해서 뷰의 상태는 정상으로 변경됨
alter table customer modify name varchar2(300);
--관련된 뷰, 함수 모두 상태가 비정상으로 변경됨
select object_name, object_type, created, status
from user_objects
where lower(object_name) in ('customer','v_customer','v2_customer','get_cust_name');
/*
OBJECT_NAME OBJECT_TYPE CREATED STATUS
------------------------------ ----------------------- --------- -------
CUSTOMER TABLE 17-MAY-24 VALID
GET_CUST_NAME FUNCTION 17-MAY-24 INVALID
V2_CUSTOMER VIEW 17-MAY-24 INVALID
V_CUSTOMER VIEW 17-MAY-24 INVALID
*/
'Database > PLSQL' 카테고리의 다른 글
113 - [Oracle PL/SQL] Dependencies - Impact on the Package (0) | 2024.05.21 |
---|---|
112 - [Oracle PL/SQL] Dependencies - Impact on the Procedure (0) | 2024.05.20 |
110 - [Oracle PL/SQL] Dependencies - Impact on the View (0) | 2024.05.17 |
109 - [Oracle PL/SQL] Dependencies - 객체의 4가지 상태 (0) | 2024.05.17 |
108 - [Oracle PL/SQL] Dependencies - Direct/Indirect (0) | 2024.05.15 |