기타

[MYBATIS] 동적 프로시저 선언 및 결과

FunnyDevelop 2024. 4. 19. 11:05

 

프로시저를 동적으로 선언하고 결과값의 컬럼값과 값이 동적인 경우

MYBATIS에서 어떻게 해야 하는지 기록을 목적

 

1. Service에서 선언과 호출

//선언부
        HashMap<String,Object> tx02Map = new  HashMap<>();
        tx02Map.put("procedureName",pce);
        tx02Map.put("slipNo","47672");
        List<HashMap<String,Object>> dataList = restDao.getSourceData(tx02Map);

 

2.  Mapper(DAO) 호출

List<HashMap<String, Object>> getSourceData(HashMap<String, Object> pce);

 

3. Mybatis 선언부

<select id="getSourceData" statementType="CALLABLE" parameterType="hashmap" resultMap="dynamicResultMap">

          {
               CALL ${procedureName}
                    (
                       #{slipNo, 			mode=IN,  jdbcType=VARCHAR, javaType=string}
                      ,#{result,            mode=OUT, jdbcType=CURSOR, javaType=java.sql.ResultSet, resultMap=dynamicResultMap}
                    )
           }

     </select>
    <resultMap id="dynamicResultMap" type="hashmap">
        <result column="*" property="*" />
    </resultMap>


4. Procedure (PL)

CREATE OR REPLACE PROCEDURE TEST(
    v_slipNo IN VARCHAR2,
    resultArr OUT SYS_REFCURSOR)
    IS
 
    --입력부
    slipNo    VARCHAR2(10)    := '';
    --RISE OUT_OF_ERROR
    e_JOB_NAME    VARCHAR(50)    := 'TEST';
    e_JOB_SOURCE  VARCHAR(15)    := 'OUT_OF_ERROR';
    e_JOB_COMMENT VARCHAR(200)   := '';
    OUT_OF_ERROR EXCEPTION;
BEGIN
    -- 변수 선언
    slipNo := v_slipNo;
    BEGIN
        OPEN resultArr FOR
            SELECT 	AA	    AS	AA	            /*	회사코드	*/
                 ,	BB	    AS	BB	            /*	회계코드	*/
                 
            FROM TX290T
            WHERE 1 = 1
        ;
    END;

/* EXCEPTION LINE */
EXCEPTION
    WHEN OUT_OF_ERROR THEN
        ROLLBACK;
        BEGIN
            INSERT INTO WORK_REST_STATE (JOB_NAME, JOB_SOURCE, CREATE_USER, CREATE_DT, JOB_COMMENT, JOB_STATE)
            VALUES ( e_JOB_NAME
                   , e_JOB_SOURCE
                   , 'SYSTEM'
                   , SYSDATE
                   , e_JOB_COMMENT
                   , '1');
            COMMIT;
--             r_result := e_JOB_COMMENT;
        END;
    WHEN OTHERS THEN
        ROLLBACK;
        e_JOB_SOURCE  := 'OTHERS';
        e_JOB_COMMENT := 'OTHERS Error : ' ||  SUBSTR(SQLERRM, 1, 200);
        BEGIN
            INSERT INTO WORK_XXXX_STATE (JOB_NAME, JOB_SOURCE, CREATE_USER, CREATE_DT, JOB_COMMENT, JOB_STATE)
            VALUES ( e_JOB_NAME
                   , e_JOB_SOURCE
                   , 'SYSTEM'
                   , SYSDATE
                   , e_JOB_COMMENT
                   , '1');
            COMMIT;
        END;
--         r_result := e_JOB_COMMENT;
        RETURN ;
/*
    EXCEPTION LINE
 */
END;

 

5. 결과

tx02Map에 AA와 BB가 들어간 것을 확인