ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Oracle] ibatis에서 오라클 프로시저(procedure)를 결과 값으로 받기(사용법)
    DataBase/Oracle 2018. 10. 31. 10:41


    스프링 개발을 하시는 분들의 글을 읽어보면 오라클 프로시저는 보통 파라미터에 담아서 사용한다. 나도 그렇게 쓰고 싶었지만, mysql도 같이 사용하기 때문에 파라미터가 아닌 결과 값을 받아와야 했다.(mysql은 프로시저에서 select가 가능해 select한 결과를 받아올 수 있다. 하지만 오라클은 select가 안됨.)


    예를 들면,


    1
    Map<String, Object> receiveMap = procedureDAO.getAnyList("procedureDAO.getAnyList", param);
    cs


    위와 같은 코드가 있으면 오라클 프로시저의 경우 out 변수가 param에 담긴다.


    하지만, 나의 조건은 receiveMap에 담아야하는 방법을 찾아야 했다. 거의 모든 분들이 param에서 값을 꺼내쓰는 글 밖에 없었고, 하루 종일 구글링을 한 결과 겨우 한 줄기 빛과 같은 포스팅을 찾아내 해결할 수 있었다. 


    param에서 오라클 프로시저 결과를 꺼내쓰는 건 많으니 이 포스팅엔 언급하지 않겠다.


    * 참고로, mybatis는 방법이 없는 것으로 보인다. 파라미터에 담아쓰는 수 밖에 없는건가 싶다.


    프로시저 작성법, ibatis 작성법, java 코드 작성법 순으로 설명.


    1. 프로시저 작성법


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    create or replace PROCEDURE "test_procedure" (
      empSeq     IN VARCHAR2 
    , compSeq     IN VARCHAR2
    , outResult  OUT SYS_REFCURSOR -- 결과로 보낼 아웃 변수
    ) IS
     
        in_cursor SYS_REFCURSOR; -- 결과 값을 담고 넘겨줄 변수 
     
    BEGIN
        
        /* 
            ......
            something SQL Query
            .......
         */    
     
        OPEN in_cursor FOR    
      SELECT company_location
           , company_name
        FROM company_table
       WHERE comp_seq = compSeq
         AND emp_seq = empSeq
     
        outResult := in_cursor;
     
    END;
    cs



    2. ibatis 작성법


    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    <parameterMap id="testParam" class="hashMap">
            <parameter property="empSeq" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />
            <parameter property="compSeq" javaType="java.lang.String" jdbcType="VARCHAR" mode="IN" />        
            <parameter property="outResult" javaType="java.sql.ResultSet" jdbcType="ORACLECURSOR" mode="OUT" /> -- 중요 포인트
    </parameterMap>
     
    <resultMap id="testResult" class="hashMap">
            <result property="company_location" column="company_location" /> -- 프로시저에서 가져오는 
            <result property="company_name" column="company_name" />
    </resultMap>
     
    /* 프로시저 사이에 tab이 있으면 안됨. 스페이스바만 공백 허용 */
    <procedure id="procedureDAO.getAnyList" parameterMap="testParam" resultMap="testResult">
        <![CDATA[
            { CALL Z_DUZON_BS_VISITOR_S_COUNT(?, ?, ?)}
        ]]>
    </procedure>
    cs



    3. java 코드


    1
    2
    3
    4
    5
    6
    7
    8
    9
    public Map<String,Object> testMethod(){
        Map<String, Object> param = new HashMap<>();    
        param.put("empSeq","111");
        param.put("compSeq","2134");
     
        Map<String, Object> receiveMap = procedureDAO.getAnyList("procedureDAO.getAnyList", param);
     
        return receiveMap; <-- receiveMap에 결과 값 
    }
    cs



    resultMap에서 return할 클래스를 다르게 지정해줘도 받을 수 있다.


    사람들이 Map으로 많이 받을 것 같아 HashMap으로 받을 경우로 예시를 썼지만, 실무에서 나는 String으로 받아야했다.


    String이나 Integer 하나로 받고자 할 경우 outResult에 String이나 Integer를 담아서 resultMap에 column을 outResult로 선언해주고 return할 class를 String이나 Integer로 선언해주면 된다.


    ibatis로 결과 값 받는 방법 찾느라 하루 종일 고생했었는데, 해결해서 뿌듯 ㅠㅠㅠㅠ

Designed by Tistory.