VoltDB中Java端实现IN操作符传入String数组参数报错如何解决
可行实现方案
1. 优先校验存储过程参数定义(90%以上的此类报错均由该原因导致)
当前报错的核心逻辑是VoltDB判定存储过程的0号参数期望单个java.lang.String类型,实际收到了字符串数组,说明创建存储过程时入参类型定义错误:
- 若SQL使用动态IN数组写法:
SELECT * from EMPLOYEE where STATUS IN ? - 则对应的存储过程入参必须定义为字符串数组类型,示例DDL如下:
CREATE PROCEDURE ABC AS SELECT * from EMPLOYEE where STATUS IN ?; -- 更稳妥的写法是显式指定参数类型,避免自动推断出错 CREATE PROCEDURE ABC (VARCHAR(32) ARRAY) AS SELECT * from EMPLOYEE where STATUS IN ?;
禁止将参数定义为单个VARCHAR(32),否则必然会出现类型不匹配错误。
2. 修正客户端调用写法
callProcedure的可变参数Object...本质是Object数组,若直接传入字符串数组,会被自动展开为多个独立参数,可通过两种写法避免展开:
写法1:显式强转为Object类型
String[] statusList = new String[]{"Salary", "Hourly", "Parttime"}; ClientResponse resp = client.callProcedure("ABC", (Object) statusList);
写法2:封装为单元素Object数组
String[] statusList = new String[]{"Salary", "Hourly", "Parttime"}; Object[] params = new Object[]{statusList}; ClientResponse resp = client.callProcedure("ABC", params);
两种写法效果完全一致,都能保证字符串数组作为单个参数传递给存储过程。
3. 低版本VoltDB兼容方案
如果使用的是7.0以下的旧版本VoltDB,不支持IN ?的动态数组写法,可以改用IN_ARRAY内置函数实现相同逻辑:
- 存储过程SQL修改为:
SELECT * from EMPLOYEE WHERE IN_ARRAY(STATUS, ?) = 1;
- 参数定义和调用方式和上述方案完全一致,兼容性更强。
内容的提问来源于stack exchange,提问作者Deep Dalsania
相关产品推荐
相关产品推荐

