1. 자바에서 호출하는 경우
1 | CallableStatement cstmt = conn.prepareCall( "{call PROC_BL_TO_UTM(?,?,?,?)}" ); |
2 | cstmt.setString( 1 , "37.465687" ); |
3 | cstmt.setString( 2 , "127.249481" ); |
4 | cstmt.registerOutParameter( 3 , OracleTypes.FLOAT); |
5 | cstmt.registerOutParameter( 4 , OracleTypes.FLOAT); |
6 | cstmt.execute(); |
7 | uTmx = cstmt.getFloat( 3 ); |
8 | uTmy = cstmt.getFloat( 4 ); |
2. iBatis에서 프로시저 호출하기
SqlMap 설정
<parameterMap class="map" id="blParam">
<parameter property="p_latitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="p_longitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="p_utmx" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
<parameter property="p_utmy" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
</parameterMap>
<procedure id="bl_to_utm" parameterMap="blParam">
<![CDATA[
{call PROC_BL_TO_UTM(?,?,?,?)}
]]>
</procedure>
<parameter property="p_latitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="p_longitude" jdbcType="VARCHAR" javaType="java.lang.String" mode="IN"/>
<parameter property="p_utmx" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
<parameter property="p_utmy" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
</parameterMap>
<procedure id="bl_to_utm" parameterMap="blParam">
<![CDATA[
{call PROC_BL_TO_UTM(?,?,?,?)}
]]>
</procedure>
java 설정
1 | Map<string, object= "" > map = new HashMap<string,object>(); |
2 | map.put( "p_latitude" ,vo.getX_latitude()); |
3 | map.put( "p_longitude" , vo.getX_longitude()); |
4 | sqlMapper.update( "VocIphone.bl_to_utm" , map ); |
5 |
6 | String utmx = map. get ( "p_utmx" ).toString(); |
7 | String utmy = map. get ( "p_utmy" ).toString();</string,object></string,> |
SqlMap 쪽에서 parameterMap 으로 설정해놓은 형식으로 프로시저에 전달되고 리턴은 데이터를 실어서 날렸던 맵으로 돌아옴
sqlMapper를 실행시킬때 update / queryForObject / queryForList 를 사용할수 있으니 리턴 타입에 맞춰서 사용하면 됨
out을 리스트로 받는 경우 resultMap을 설정해서 List 형태로도 받을수 있다.
<parameter property="result" jdbcType="ORACLECURSOR" javaType="java.sql.ResultSet" resultMap="resultParam" mode="OUT"/>
resultMap을 설정해주고 resultMap에서 property와 column이름을 설정해주고 class를 미리 만들어놓은 VO객체로 넣어주면 해당항목의 리스트로 프로시저 실행결과가 리턴된다.
3. 주의사항
sqlMap에서 프로시저를 호출할때
<procedure id="bl_to_utm" parameterMap="blParam">
{
call PROC_BL_TO_UTM(?,?,?,?)
}
</procedure>
{
call PROC_BL_TO_UTM(?,?,?,?)
}
</procedure>
위의 코드처럼 중괄호를 적어놓으면 에러가 난다..;; 괜히 보기 편하게 만든다고 했다가 삽질하게 된다.
파라미터의 타입
만약 프로시저의 파라미터가 Number 타입이라면.. OUT 파라미터 정의에서 Number라고 쓰면 에러가 남
오라클의 경우 프로시저 내부에서 Number를 BigDecimal로 변환해서 사용한다고 한다. 따라서 아래처럼 적으면 에러가 난다.
<parameter property="p_utmy" jdbcType="NUMBER" javaType="java.util.Number" mode="OUT"/>ERROR
<parameter property="p_utmy" jdbcType="DECIMAL" javaType="long" mode="OUT"/>
jdbcType="DECIMAL"이런 형태로 적어줘야 정상적으로 실행된다.
출처 : http://rinn.kr/46
'Database > MyBatis' 카테고리의 다른 글
[ORM] MyBatis 동적 쿼리 trim (0) | 2018.03.28 |
---|---|
[delete] 개인정보 모든테이블 삭제 (0) | 2016.01.12 |
[Spring] Repository sqlMapClientTemplate 맵핑 (0) | 2014.08.03 |
org.springframework.dao.DataAccessResourceFailureException / RecoverableDataAccessException (0) | 2014.03.25 |
[iBatis] Multi Insert 시 List 형태와 Map 형태 (0) | 2014.02.24 |