我正在尝试将一个整数数组传递给Oracle存储过程。
这是我的甲骨文方面:
-- Package Declaration
TYPE num_array IS TABLE OF NUMBER;
PROCEDURE test_arrays(p_array IN num_array);
-- Package Body
PROCEDURE test_arrays(p_array IN num_array)
IS
BEGIN
FOR i IN 1 .. p_array.count
LOOP
INSERT INTO GENERAL.TEST_ARRAYS VALUES (p_array(i));
END LOOP;
END;
太简单了。现在,我需要从数据库传递一个整数数组。这是我的代码:
public void testArrays() {
int[] intArray = new int[100];
for(int i=0; i<100; i++) {
intArray[i] = i;
}
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(this.jdbcTemplate)
.withSchemaName("general")
.withCatalogName("sms_package")
.withProcedureName("test_arrays");
SqlParameterSource parameterSource = new MapSqlParameterSource()
.addValue("p_array", intArray, Types.ARRAY);
simpleJdbcCall.execute(parameterSource);
}
这将引发无效的列类型。
在做了一些研究之后,我发现我需要创建一些数组描述符,我尝试了一些代码:
SqlTypeValue pvCodScg = new AbstractSqlTypeValue() {
protected Object createTypeValue(Connection conn, int sqlType, String typeName) throws SQLException {
ArrayDescriptor arrayDescriptor = new ArrayDescriptor(typeName, conn);
return new ARRAY(arrayDescriptor, conn, intArray);
}
};
我把它当做:
SqlParameterSource parameterSource = new MapSqlParameterSource()
.addValue("p_array", pvCodScg);
这还是不管用。
1条答案
按热度按时间qco9c6ql1#
您会将什么作为“typeName”进行传递?它必须是目标模式的已知Oracle类型:可以是类似SYS.ODCIVARCHAR2LIST的类型,...或您定义的类型(例如...的表)所以在您的例子中可能是“NUM_ARRAY”。(注意您可以使用SYS.ODCINUMBERLIST)(我不记得传递小写是否有效,所以我更喜欢始终使用大写)NB当直接使用JDBC时,有一个PreparedSteament.setArray函数,不确定MapSql参数是否对SqlTypeValue做了正确的事情,因为我看到它正在测试“instanceof Sql参数值”。