oracle type object
CREATE OR REPLACE TYPE 스키마."VARR" IS TABLE OF VARCHAR2(2048);
TypeHandler
import oracle.jdbc.Oracleconnection;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType
public class VarrTypeHandler extends BaseTypeHandler<Object> {
/**
* DB에서 관리중인 Type의 이름
* - DB에 이 이름으로 Type Object가 미리 준비되어 있어야 함.
*/
private static final String TYPE_NAME = "VARR";
/**
* 최초 구현하지 않았던 메서드
* setNonNullParameter()의 태생적 한계(null 파라미터 처리 불가)로 인해 최종적으로 이 메서드를 사용하게 되었음.
*/
@Override
public void setParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
log.debug("## VarrTypeHandler.setParameter({}) called!", parameter);
try{
OracleConnection conn = ps.getConnection().unwrap(OracleConnection.class);
String[] arrayValues = parameter != null ? (String[]) parameter : null;
Array array = conn.createOracleArray(TYPE_NAME, arrayValues);
ps.setArray(i, array);
}catch(SQLException ex){
log.error("## VarrTypeHandler Exception", ex);
}
}
/**
* 최초 이 메서드에 파라미터 바인딩 기능을 구현했으나, array parameter가 null일 경우에 대한 처리를 할 수 없어서 결국 setParameter() 에 구현함.
* setParameter() 를 구현한 시점에서 이 메서드는 호출되지 않으나, interface상 필수 메서드라서 override 함.
*/
@Override
public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, JdbcType jdbcType) throws SQLException {
log.debug("## VarrTypeHandler.setNonNullParameter({}) called!", parameter);
}
@Override
public List<Map<String, Object>> getNullableResult(ResultSet rs, String columnName) throws SQLException {
log.debug("## VarrTypeHandler.getNullableResult 1 called!");
return null;
}
@Override
public List<Map<String, Object>> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
log.debug("## VarrTypeHandler.getNullableResult 2 called!");
return null;
}
@Override
public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
log.debug("## VarrTypeHandler.getNullableResult 3 called!");
return null;
}
}
mybatis config
<typeAliases>
...
<typeAlias alias="varrTypeHandler" type="[패키지경로].varrTypeHandler" />
</typeAliases>
mybatis query xml
<parameterMap id="procedure01PMap" type="map">
...
<parameter property="[변수명]" typeHandler="varrTypeHandler" mode="IN" />
...
</parameterMap>
<update id="procedure01" statementType="CALLABLE" parameterMap="procedure01PMap">
{ ? = call PKG01.PROC01( ?, ?, ? ) }
</update>