使用JdbcTemplate将Java数组传递给Oracle存储过程

bvuwiixz  于 2022-09-18  发布在  Java
关注(0)|答案(1)|浏览(206)

我正在尝试将一个整数数组传递给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);

这还是不管用。

qco9c6ql

qco9c6ql1#

您会将什么作为“typeName”进行传递?它必须是目标模式的已知Oracle类型:可以是类似SYS.ODCIVARCHAR2LIST的类型,...或您定义的类型(例如...的表)所以在您的例子中可能是“NUM_ARRAY”。(注意您可以使用SYS.ODCINUMBERLIST)(我不记得传递小写是否有效,所以我更喜欢始终使用大写)NB当直接使用JDBC时,有一个PreparedSteament.setArray函数,不确定MapSql参数是否对SqlTypeValue做了正确的事情,因为我看到它正在测试“instanceof Sql参数值”。

相关问题