본문 바로가기

Database/PLSQL

050 - [Oracle PL/SQL] Package - Overloading (procedures)

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

 

 

 

 

 

 

 

 

  • 헤더와 바디 부분 샘플

 

 

 

 

  • 테스트용 테이블을 하나 생성합니다
drop table customer;

create table customer
(cust_id number,
 name varchar2(100),
 birthday date
);

 

 

 

  • 이름이 같은 프로시져를 생성합니다. 다만, 파라미터의 개수가 다릅니다.
# case 1 ( 2 procedure differ in number of parameters)

create or replace package overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date);
    procedure add_cust(p_id number,p_name varchar2);
end;
/
create or replace package body overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date)
    is 
    begin
    insert into customer (cust_id,name,birthday)
    values (p_id,p_name,p_bd);
    commit;
    
    end;
 
    procedure add_cust(p_id number,p_name varchar2)
    is 
    begin
    insert into customer (cust_id,name)
    values (p_id,p_name);
    commit;
    
    end;
end;

 

 

 

  • 파라미터 개수를 하나는 3개, 다른 하나는 2개를 입력하고 실행하니 각각 다른 프로시져가 실행됩니다
execute overload_proc.add_cust(1,'jack','1-jan-90');

select * from customer;
-------------------------------------------------
   CUST_ID NAME            BIRTHDAY 
---------- --------------- ---------
         1 jack            01-JAN-90



execute overload_proc.add_cust(2,'ford');

select * from customer;
-------------------------------------------------
   CUST_ID NAME            BIRTHDAY 
---------- --------------- ---------
         1 jack            01-JAN-90
         2 ford

 

 

 

  • 이번에는 이름이 같은 프로시져 3개를 생성하여, 파라미터 타입이 다른 경우를 테스트 합니다.
# case 2 ( 2 procedure same number of parameters, differ in type)

create or replace package overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date);
    procedure add_cust(p_id number,p_name varchar2);
    procedure add_cust(p_name varchar2,p_id number);
end;
/
create or replace package body overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date)
    is 
    begin
    insert into customer (cust_id,name,birthday)
    values (p_id,p_name,p_bd);
    commit;
    
    end;
 
    procedure add_cust(p_id number,p_name varchar2)
    is 
    begin
    insert into customer (cust_id,name)
    values (p_id,p_name);
    commit;
    
    end;
 
    procedure add_cust(p_name varchar2,p_id number)
    is 
    begin
    insert into customer (name,cust_id)
    values (p_name,p_id);
    commit;
    
    end;
 
end;

 

 

 

  • 파라미터 타입이 다른 경우, 3번째 프로시져가 잘 호출됩니다.
execute overload_proc.add_cust('ali',3);

select * from customer;
-------------------------------------------------------------------
   CUST_ID NAME            BIRTHDAY 
---------- --------------- ---------
         1 jack            01-JAN-90
         2 ford                     
         3 ali

 

 

 

  • 파라미터의 타입은 다르지만 number, interger 와 같이 같은 그룹에 속한 타입을 사용하면 오류가 발생합니다
# case 3 ( 2 procedure same number of parameters, same family)

create or replace package overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date);
    procedure add_cust(p_id integer,p_name varchar2,p_bd date);
end;
/
create or replace package body overload_proc
is
    procedure add_cust(p_id number,p_name varchar2,p_bd date)
    is 
    begin
    insert into customer (cust_id,name,birthday)
    values (p_id,p_name,p_bd);
    commit;
    dbms_output.put_line('run first procedure');
    end;
    
    procedure add_cust(p_id integer,p_name varchar2,p_bd date)
    is 
    begin
    insert into customer (cust_id,name,birthday)
    values (p_id,p_name,p_bd);
    commit;
    dbms_output.put_line('run second procedure');
    end;
  
end;

 

 

 

 

오류가 발생합니다. number, interger 는 같은 family 타입이기 때문입니다

execute overload_proc.add_cust(10.6,'dina','1-jan-90');
------------------------------------------------------------------
Error report -
ORA-06550: line 1, column 7:
PLS-00307: too many declarations of 'ADD_CUST' match this call
ORA-06550: line 1, column 7:
PL/SQL: Statement ignored
06550. 00000 -  "line %s, column %s:\n%s"
*Cause:    Usually a PL/SQL compilation error.
*Action: