* 개요
공통 업무에 대한 오라클 프로시저를 만드는데, 호출시 인수의 갯수가 다르면 에러가 발생하는 문제가 있었다.
(오류메세지 : ORA-06550 ... PLS-00306 'XXX' 호출시 인수의 갯수나 유형이 잘못되었습니다.)
공통이라서 인수의 갯수도 많고 종류도 다양한데, 각 업무에서 그 프로시저를 호출할 때는 모든 인수가 필요한 것이 아니라 몇 개의 인수가 필요할 뿐인데도, 호출 부분 코딩에서 모든 인수를 기입해 주어야 하는 것이 상당히 귀찮았고, 프로시저 시그니처 변경시 해당 프로시저의 모든 호출부를 변경해 주어야 하는 문제점이 보여서 방법이 없을까 하고 검색을 해 보았다.
검색을 해 보니, 오라클에서는 파라미터의 순서가 아닌 이름으로 바인딩 하는 방법을 제공하고 있었고, 기본값 지정을 통해서 호출시 특정 파라미터를 생략할 수 있는 기능을 제공하고 있었다.
* 해결 방법
(1) 호출 대상 프로시저에서의 작업
- 생략 가능하도록 하고 싶은 파라미터의 정의부에 기본값을 정의한다.
(2) 프로시저 호출부에서의 작업
- 파라미터를 넘겨주는 부분에, 파라미터명과 바인딩 연산자(=>)를 사용하여 이름 바인딩을 한다.
- 생략하고 싶은 파라미터에 기본값이 지정되어 있을 경우 해당 파라미터를 생략할 수 있다.
* 코드 샘플
-- 프로시저
CREATE OR REPLACE PROCEDURE PROC_TEST (
inArg0 IN NVARCHAR2 DEFAULT 'ZZZ', -- 기본값을 지정해야 생략할 수 있다.
inArg1 IN NVARCHAR2
)
IS
BEGIN
dbms_output.put_line('######## PROC_TEST ########');
dbms_output.put_line('inArg0: '||inArg0);
dbms_output.put_line('inArg1: '||inArg1);
END;
-- 프로시저 테스트 코드 1
BEGIN
PROC_TEST(
/* inarg0 => :inarg0,*/ /* 인수 생략 테스트 */
inarg1 => :inarg1
);
END;
-- 프로시저 테스트 코드 2
DECLARE
I_EXECUTESTEP INTEGER;
I_ERR INTEGER;
VC_RESULTMSG NVARCHAR2(2000);
VC_RETURNMSG NVARCHAR2(2000);
BEGIN
SPOM_CREATION.ORDERCLOSE(AVC_SYSTEM => 'WMSAPP',
AVC_EXECUTEMODE => 'DEBUG',
AVC_COMMAND => 'ORDERCLOSE',
AVC_DCCODE => '0575',
AVC_STORERKEY => 'SJD',
AVC_ORGANIZE => '@',
AVC_AREA => '@',
AVC_REQUESTCODE => '',
AVC_REQUESTMSG => '<DCCODE>0575</DCCODE><STORERKEY>SJD</STORERKEY>',
AVC_WORKER => 'dev01',
AVC_SECURITYKEY => '',
AI_SPID => 2485,
I_EXECUTESTEP => I_EXECUTESTEP,
I_ERR => I_ERR,
VC_RESULTMSG => VC_RESULTMSG,
VC_RETURNMSG => VC_RETURNMSG);
END;
* 참고 링크