본문 바로가기

Database/PLSQL

111 - [Oracle PL/SQL] Dependencies - Impact on the Function

 

 

 

  • 테스트 준비
--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
*/