问题描述
我正在尝试通过 iBatis 将字符串数组发送到存储过程调用,但出现以下异常
原因:org.apache.ibatis.type.TypeException:无法设置映射参数:ParameterMapping{property='p_site_id',mode=IN,javaType=class java.lang.Object,jdbcType=VARCHAR,numericScale=null,resultMapId='null',jdbcTypeName='null',expression='null'}.
原因:java.sql.SQLFeatureNotSupportedException:不支持的功能
- Java 版本:8
- ojdbc 版本:7.12.1.0
这些是我的应用程序中的不同层。
Layer 1:调用mapper函数的函数调用
private long addDocumentToDatabase(Document doc,String[] sites) {
Map<String,Object> parms = new HashMap<String,Object>(16);
parms.put(FILE_NAME,doc.getSourceFileName());
parms.put(COUNTRY_NAME,doc.getCountryName());
parms.put(SITE_ID,sites);
parms.put(P_RESULT,null);
SqlSession sqlSession = this.getSqlSession();
DocumentMapper docMapper = sqlSession.getMapper(DocumentMapper.class);
try {
docMapper.addDocument(parms);
...
Layer 2:定义函数的Mapper接口
@Mapper
public interface DocumentMapper {
...
public int addDocument(Map<String,Object> param);
...
第 3 层:调用存储过程的映射器 XML 文件
<update id="addDocument" statementType="CALLABLE">
{
CALL AUTOMATOR.addDocument
(
#{file_name,jdbcType=VARCHAR},#{country_name,#{p_site_id,jdbcType=ARRAY,typeHandler=com.handler.OracleStringArrayTypeHandler},#{p_result,mode=OUT,jdbcType=NUMERIC}
)
}
</update>
TypeHandler
类:
public class OracleStringArrayTypeHandler implements TypeHandler {
@Override
public void setParameter(PreparedStatement ps,int i,Object parameter,JdbcType jdbcType) throws SQLException {
if (parameter == null) {
ps.setNull(i,Types.ARRAY);
} else {
Connection conn = ps.getConnection();
Array loc = conn.createArrayOf("StringArray",(Object[]) parameter);
ps.setArray(i,loc);
}
}
...
@Override
public Object getResult(CallableStatement cs,int columnIndex) throws SQLException {
return cs.getArray(columnIndex).getArray();
}
}
Oracle存储过程定义:在Oracle中声明了一个varray,作为存储过程的输入参数的类型。
PROCEDURE addDocument (
file_name IN VARCHAR2,country_name IN VARCHAR2,site_id IN site_varray,p_result OUT NUMBER
);
create or replace TYPE site_varray AS VARRAY(50) OF VARCHAR2(50);
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)