본문 바로가기

Database/PLSQL

051 - [Oracle PL/SQL] Package - Overloading (functions)

<샘플코드에서 사용한 데이터는 HR 스키마이고, 오라클 설치시 생성할 수 있는 기본 스키마 입니다>

 

 

함수에서도 overloading 이 가능합니다.

 

  • 파라미터의 타입이 다른 샘플입니다.
create or replace package overload_funcion
is
    function f1 (p1 number) return number;
    function f1 (p1 varchar2) return varchar2;

end;
/
create or replace package body overload_funcion
is
    function f1 (p1 number) return number
    is
    begin
    return p1;
    end;
    
    function f1 (p1 varchar2) return varchar2
    is 
    begin
    return 'hi~ '||p1;
    end;
  
end;

 

 

 

select overload_funcion.f1(1) from dual;
-------------------------------------------------------
OVERLOAD_FUNCION.F1(1)
----------------------
                     1


select overload_funcion.f1('1') from dual;
-------------------------------------------------------
OVERLOAD_FUNCION.F1('1') 
-------------------------
hi~ 1

 

 

 

  • 오류가 발생하는 샘플 - 함수의 파라미터 타입이 같은 경우
create or replace package overload_funcion
is
    function f1 (p1 number) return number;
    function f1 (p1 number) return varchar2;

end;
/
create or replace package body overload_funcion
is
    function f1 (p1 number) return number
    is
    begin
    return p1;
    end;
    
    function f1 (p1 number) return varchar2
    is 
    begin
    return p1||'hi';
    end;
  
end;

 

 

 

오류가 발생합니다.

select overload_funcion.f1(1) from dual;
-------------------------------------------------------
ORA-06553: PLS-307: too many declarations of 'F1' match this call
06553. 00000 -  "PLS-%s: %s"
*Cause:    SQL compilation failed because of an illegal reference to a
           PL/SQL unit.
*Action:   If the PL/SQL error message does not provide a workaround, then
           try the SQL statement as a top-level call as the appropriate user
           with the appropriate privileges.
Error at Line: 188 Column: 8

 

 

 

  • 컴파일된 오브젝트 확인하는 방법 - 항상 대문자로 조회를 해야 합니다.
select * from user_objects
where object_name = upper('overload_funcion')
;