You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java如何向Informix存储过程传递integer类型set/整数数组参数

解决方案

报错根因

Routine (sp_demo_set_arg) can not be resolved报错本质不是存储过程不存在,而是Informix无法识别你传入的JavaHashSet作为SET(INTEGER)类型的参数,找不到参数类型匹配的存储过程重载,所以抛出找不到存储过程的错误。

正确实现步骤

1. 依赖说明

使用Informix官方JDBC驱动中提供的IfxCollection类来构造符合Informix要求的SET类型对象。

2. 修改后的Java调用代码

import com.informix.jdbc.IfxCollection;
import java.sql.Connection;
import java.sql.CallableStatement;
import java.sql.SQLException;
import java.util.List;

@Override
public Integer callProcedure(List<Integer> listOfId) {
    String sql = "{ call sp_demo_set_arg(?) }";
    
    Connection conn = null;
    try {
        conn = dataSource.getConnection();
        // 构造Informix识别的SET类型对象,参数依次为集合类型、元素类型、数据库连接
        IfxCollection arg1 = new IfxCollection("SET", "INTEGER", conn);
        // 往集合中添加元素,也可以遍历传入的listOfId添加
        for (int i=1; i <= 3; i++) {
            arg1.add(i);
        }
        
        CallableStatement stmt = conn.prepareCall(sql);
        // 传入集合对象,指定类型为OTHER表示是数据库自定义类型
        stmt.setObject(1, arg1, java.sql.Types.OTHER);
        stmt.executeUpdate();
        return 0;
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        // 用完关闭连接避免资源泄露
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    return 1;
}

3. 前置验证

可先在Informix的dbaccess工具中执行以下语句,确认存储过程本身可以正常运行:

execute procedure sp_demo_set_arg(SET{1,2,3});

如果执行报错,需要先排查存储过程本身的语法、权限问题。

其他注意事项

  • 如果你的SET元素是其他类型,比如CHAR(20),构造IfxCollection的时候第二个参数改成对应的类型名CHAR(20)即可
  • 你当前使用的JDBC 4.10.14、4.50.7版本都完全支持IfxCollection的用法,不需要升级驱动

内容的提问来源于stack exchange,提问作者user3737906

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 16:06:00