오라클 프로시저 (Oracle Stored Procedure) 호출시 파라미터(인수)의 갯수를 가변적으로 받을 수 있도록 하는 방법

By | 8월 6, 2013

* 개요

공통 업무에 대한 오라클 프로시저를 만드는데, 호출시 인수의 갯수가 다르면 에러가 발생하는 문제가 있었다.
(오류메세지 : 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;

* 참고 링크

   Default Parameter Values   

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments