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
相关产品推荐
相关产品推荐

