<샘플코드에서 사용한 데이터는 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:
'Database > PLSQL' 카테고리의 다른 글
052 - [Oracle PL/SQL] Package - Overloading (standard package) (0) | 2024.03.06 |
---|---|
051 - [Oracle PL/SQL] Package - Overloading (functions) (1) | 2024.03.06 |
049 - [Oracle PL/SQL] Package - recompile the package (0) | 2024.02.28 |
048 - [Oracle PL/SQL] Package - visibility of components (0) | 2024.02.28 |
047 - [Oracle PL/SQL] Package - guidelines for packages (0) | 2024.02.28 |