如何解决如何使用 iBatis 将数组传递给 Oracle 存储过程?
我正在尝试通过 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
这些是我的应用程序中的不同层。
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);
...
<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 举报,一经查实,本站将立刻删除。