簡體   English   中英

使用 JdbcTemplate 將 Java 數組傳遞給 ORACLE 存儲過程

[英]Pass an Java Array to ORACLE Stored Procedure using JdbcTemplate

我正在嘗試將 Integer 數組傳遞給 Oracle 存儲過程。

這是我的 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;

很簡單。 現在我需要從數據庫中傳遞一個 integer 數組。 這是我的代碼:

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);

但這仍然行不通。 任何幫助,將不勝感激。

謝謝

你傳遞什么作為“typeName”? 它必須是目標模式的已知 ORACLE 類型:類似於 SYS.ODCIVARCHAR2LIST,...或您定義的 TYPE(例如 TABLE OF...),因此在您的情況下可能是“NUM_ARRAY”。 (注意你可以使用 SYS.ODCINUMBERLIST)(我不記得傳遞小寫是否有效,所以我更喜歡總是使用大寫) 注意直接使用 JDBC 時,有一個 PreparedSteament.setSqlArray function,不確定 Map 是否正確使用 SqlTypeValue 的東西,因為我看到它正在測試“instanceof SqlParameterValue”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM