微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用 iBatis 将数组传递给 Oracle 存储过程?

如何解决如何使用 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 举报,一经查实,本站将立刻删除。