2015年5月13日 星期三

[Java] 如何將陣列 Array 輸入至 Stored Procedure 當中

 

有一個 Stored Procedure 為 SP_COUNT_WHICH 其輸入參數有字串及陣列,下面的範例就是可以讓使用者將陣列資料利用 Java Code 傳入到該 Stored Procedure。

範例 Code:

Connection conn;
CallableStatement cstmt = null;
String dbUrl ="jdbc:oracle:thin:@10.1.1.1:1530:TEST";
String user ="test";
String pw = "test";
float resultValue = 0.0f;
// 帶入 Stored Procedure 的陣列
String[] selectItemCode = new String[]{"111111","222222"};
try{
    Class.forName("oracle.jdbc.driver.OracleDriver");
    conn = DriverManager.getConnection(dbUrl, user, pw);
    // 描述 StoreProcedure Array_Table
    ArrayDescriptor des = ArrayDescriptor.createDescriptor("TEST.ARRAY_TABLE",conn);
    ARRAY array_to_pass = new ARRAY(des,conn,selectItemCode);

    // 裡面填入要使用的 SP
    cstmt = conn.prepareCall("call SP_COUNT_WHICH(?,?,?)");
    // 接下來傳入參數值
    cstmt.setString(1, selectCode);
    cstmt.setArray(2, array_to_pass);
    cstmt.registerOutParameter(3, java.sql.Types.FLOAT);
    cstmt.execute();
    // 該 Stored Procedure 輸出值為 Float 格式
    resultValue = cstmt.getFloat(3);
}catch(Exception ex){
    ex.printStackTrace();
}finally{ …..

注意的是,該Stored Procedure 在建置時,須建立一個該輸入陣列對照的資料,如下:

字串型態的陣列

CREATE TYPE ARRAY_TABLE AS TABLE OF VARCHAR2 (50); -- Array of String

如是數字格式的陣列

CREATE TYPE ARRAY_INT AS TABLE OF NUMBER;          -- Array of integers

如此上方的 TEST.ARRAY_TABLE 才能有效用 (TEST 為 ScheamName,即為 jdbc:oracle:thin:@10.1.1.1:1530:TEST)

相關資料:

Java: Passing Array To Oracle Stored Procedure

How to call oracle stored procedure which include user-defined type in java?

pass array to oracle procedure

Class ArrayDescriptor

注意事項:

若發現怎麼樣都無法正常傳送資料,請確認一下資料來源部分的資料型態有沒有設定錯誤

DROP TYPE TEST.ARRAY_TABLE;

CREATE OR REPLACE TYPE TEST.array_table AS TABLE OF NVARCHAR2(50);

中文系統部分,若設定為 VARCHAR2 可能會有上述無法正常傳送資料到 Stored Procedure。

1 則留言 :