| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 | 27 |
| 28 | 29 | 30 |
- 알고리즘
- 자바
- PARSEINT
- 1레벨
- 문자열
- 참조형
- 짝수
- StringBuffer
- 프로그래머스
- substring
- Math.min
- Java
- 오라클
- programmers
- oracle
- Linux
- 코테
- 데이터베이스
- SQL
- toLowerCase
- 1level
- 1단계
- 코딩테스트
- 1lv
- 디비
- Integer
- string
- Math.max
- 배열
- 도메인
- Today
- Total
웹 프로그래밍
ibatis로 oracle package, procedure 호출 본문
프로시저가 구현된 후를 가정해서 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 |
|---|