Index: ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java =================================================================== --- ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java (revision 907999) +++ ibatis-3-core/src/main/java/org/apache/ibatis/builder/SqlSourceBuilder.java (working copy) @@ -79,7 +79,9 @@ builder.resultMapId(value); } else if ("typeHandler".equals(name)) { builder.typeHandler((TypeHandler) resolveInstance(value)); - } + } else if ("sqlTypeName".equals(name)) { + builder.sqlTypeName(value); + } } else { throw new BuilderException("Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}"); } Index: ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/CallableStatementHandler.java =================================================================== --- ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/CallableStatementHandler.java (revision 907999) +++ ibatis-3-core/src/main/java/org/apache/ibatis/executor/statement/CallableStatementHandler.java (working copy) @@ -74,7 +74,11 @@ if (parameterMapping.getNumericScale() != null && (parameterMapping.getJdbcType() == JdbcType.NUMERIC || parameterMapping.getJdbcType() == JdbcType.DECIMAL)) { cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE, parameterMapping.getNumericScale()); } else { - cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE); + if (parameterMapping.getSqlTypeName() == null) { + cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE); + } else { + cs.registerOutParameter(i + 1, parameterMapping.getJdbcType().TYPE_CODE, parameterMapping.getSqlTypeName()); + } } } } Index: ibatis-3-core/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java =================================================================== --- ibatis-3-core/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java (revision 907999) +++ ibatis-3-core/src/main/java/org/apache/ibatis/mapping/ParameterMapping.java (working copy) @@ -16,6 +16,7 @@ private Integer numericScale; private TypeHandler typeHandler; private String resultMapId; + private String sqlTypeName; private ParameterMapping() { } @@ -67,6 +68,11 @@ return this; } + public Builder sqlTypeName(String sqlTypeName) { + parameterMapping.sqlTypeName = sqlTypeName; + return this; + } + public ParameterMapping build() { resolveTypeHandler(); return parameterMapping; @@ -113,4 +119,8 @@ return resultMapId; } + public String getSqlTypeName() { + return sqlTypeName; + } + } Index: ibatis-3-core/src/main/java/org/apache/ibatis/type/JdbcType.java =================================================================== --- ibatis-3-core/src/main/java/org/apache/ibatis/type/JdbcType.java (revision 907999) +++ ibatis-3-core/src/main/java/org/apache/ibatis/type/JdbcType.java (working copy) @@ -33,7 +33,8 @@ UNDEFINED(Integer.MIN_VALUE + 1000), NVARCHAR(-9), NCHAR(-15), - NCLOB(2011); + NCLOB(2011), + STRUCT(Types.STRUCT); public final int TYPE_CODE; private static Map codeLookup = new HashMap();