如何使用 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

这些是我的应用程序中的不同层。

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 (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...