웹 프로그래밍

ibatis로 oracle package, procedure 호출 본문

Ibatis

ibatis로 oracle package, procedure 호출

B. C Choi 2024. 5. 7. 20:45
반응형

프로시저가 구현된 후를 가정해서 java 선언부터 호출까지 나열할 예정이다.

내용의 하단에는 직접 구현하면서 마주친 에러를 토대로 주의사항을 정리했다.

 

 

■ 개발 환경

    - Language : Java

    - Framework : Spring

    - ORM : Ibatis

    - DBMS : Oracle

    - DB Tool : Dbeaver

    - Library : ibatis-2.3.4.726.jar, slf4j-api-1.5.6.jar

    - SDK: jdk1.8.0_281

 

 

 

■ 예제

    1) .java

         1-1) Controller

          ※ 예시를 위해 Service, DAO 없이 구현했다. Functions 클래스가 DAO 역할을 대신한다.

SqlMapClient client = SqlMapMgr.getSqlMap();

try {
    client.startTransaction();

    // REGIST 파라미터 세팅
    LinkedHashMap<String, Object> reqMap = new LinkedHashMap<>();
    reqMap.put("name"          , "툷셂붥");
    reqMap.put("age"           , 25);
    reqMap.put("salary"        , 1000000L);
    reqMap.put("dept"          , "사업부");
    reqMap.put("result_code"   , "3333");
    reqMap.put("result_msg"    , "등록 요청");

    // PKG_EMP 패키지의 REGIST 프로시저 호출
    logger.info("reqMap1 {}", reqMap);
    Functions.callPkgReg(client, reqMap);
    logger.info("reqMap2 {}", reqMap);
        
} catch (SQLException e) {
    e.printStackTrace();
}

 

 

          1-2) Functions

public static Object callPkgReg(SqlMapClient client, Map<String, Object> param) throws SQLException {
    return client.queryForObject("insertEmp", param);
}

 

           - queryForObject : db의 결과로 1개의 레코드만 반환되는 경우 사용한다.

                                         한개의 레코드만 반환되는지 검사하는 메소드로 1개 초과일 경우 예외 처리 된다.

                                         값이 없을 경우는 null을 반환한다.

           - queryForList : db의 결과로 1개 이상의 레코드가 반환되는 경우 사용한다.

 

 

     2) .xml

<parameterMap id="regist" class="Map">
    <parameter property="name"            jdbcType="VARCHAR" javaType="java.lang.String"   mode="IN"/>
    <parameter property="age"             jdbcType="INTEGER" javaType="java.lang.Integer"  mode="IN"/>
    <parameter property="salary"          jdbcType="NUMBER"  javaType="java.lang.Long"     mode="IN"/>
    <parameter property="dept"            jdbcType="VARCHAR" javaType="java.lang.String"   mode="IN"/>
    <parameter property="result_code"     jdbcType="CHAR"    javaType="java.lang.String"   mode="OUT"/>
    <parameter property="result_msg"      jdbcType="VARCHAR" javaType="java.lang.String"   mode="OUT"/>
</parameterMap>

<procedure id="insertEmp" resultClass="Map" parameterMap="regist">
    {
        CALL PKG_EMP.REGIST(?, ?, ?, ?, ?, ?)
    }
</procedure>

 

※ 패키지의 특정 프로시저 호출 시 → CALL 패키지명.프로시저명

※ 프로시저 호출 시 → CALL 프로시저명

 

 

 

■ 결과

reqMap1 {name=툷셂붥, age=25, salary=1000000, dept=사업부, result_code=3333, result_msg=등록 요청}
reqMap2 {name=툷셂붥, age=25, salary=1000000, dept=사업부, result_code=0000, result_msg=등록 완료}

 

※ 참고 : 0000(등록 완료), 3333(등록 요청), 9999(등록 실패)

 

 

 

■ 주의사항

    1) 파라미터 세팅 시 javaType - jdbcType 확인하기.

         - VARCHAR   →    java.lang.String

         - CHAR          →    java.lang.String

         - INTEGER    →    java.lang.Integer

         - NUMBER     →    java.lang.Long

 

     2) xml에서 parameterMap 태그의 id 값과 procedure 태그의 parameterMap 값 일치시키기.

 

     3) 호출 쿼리 입력 시 IN, OUT의 매개변수 모두 입력하기.

          예 : IN - 4개, OUT 2개 → CALL TEST(?, ?, ?, ?, ?, ?)

반응형

'Ibatis' 카테고리의 다른 글

ibatis, mybatis 대소 비교  (0) 2024.05.20