2012-03-22 18 views
1

我試圖創建一個簡單的例子來了解如何從/存儲,然後檢索(float數組)數據到Java程序到Oracle數據庫(11.2G簡單的例子)通過基於VARRAY的PL/SQL存儲過程。新手使用VARRAY與JDBC和PL/SQL存儲過程

我已經盡力把Java程序放在一起,但可能有一兩個錯誤。我也堅持寫如何編寫PL/SQL代碼來寫入然後從數據庫中讀取VARRAY。任何意見,將不勝感激。

Java程序:

// create example array 
double[] myArray = new double[3]; 
myArray[0] = 1.1; 
myArray[1] = 2.2; 
myArray[2] = 3.3; 
... 
// setup call to stored procedure using SQL92 syntax 
cs = conn.prepareCall("{call my_sproc (?,?)}"); 
// set IN parameters 
cs.setString(1, myArray); 
// set OUT parameters 
cs.registerOutParameter(2, Types.ARRAY, "my_array"); 
// execute 
cs.execute(); 
// retrieve array 
double[] returnedArray = new double[3]; 
returnedArray = cs.getArray(2); 
... 

PL/SQL存儲過程:

create or replace procedure my_sproc ( 
    input_array IN as VARRAY(3) of BINARY_FLOAT, 
    output_array OUT as VARRAY(3) of BINARY_FLOAT) 
as 
begin 

-- how to write input_array into any example table? 

-- how to read input_array from example table and store in variable: output_array? 

end my_sproc; 

回答

2

這是一個在PL/SQL相當少見使用VARRAY因爲你必須指定一個最大長度。使用基於嵌套表或關聯數組的集合更爲常見。

如果你想使用VARRAY基於集合,你可以這樣做

create type float_array 
    is varray(3) of binary_float; 
/

create table foo (
    col1 number 
); 
/

create or replace procedure varray_proc(p_in_arr in float_array, 
             p_out_arr out float_array) 
as 
begin 
    for i in 1 .. p_in_arr.count 
    loop 
    insert into foo(col1) 
     values(p_in_arr(i)); 
    end loop; 
    select col1*2 
    bulk collect into p_out_arr 
    from foo; 
end; 
/

您可以從PL/SQL調用過程

SQL> declare 
    2 l_in_arr float_array := float_array(1.1, 2.2, 3.3); 
    3 l_out_arr float_array; 
    4 begin 
    5 varray_proc(l_in_arr, 
    6     l_out_arr); 
    7 for i in 1 .. l_out_arr.count 
    8 loop 
    9  dbms_output.put_line(l_out_arr(i)); 
10 end loop; 
11 end; 
12/
2.20000005E+000 
4.4000001E+000 
6.5999999E+000 

PL/SQL procedure successfully completed. 

這將是更爲常見的聲明並使用其最終看起來幾乎完全一樣的VARRAY代碼只是沒有長度限制嵌套表型

create type float_nt 
    is table of binary_float; 

create or replace procedure varray_proc(p_in_arr in float_nt, 
             p_out_arr out float_nt) 
as 
begin 
    for i in 1 .. p_in_arr.count 
    loop 
    insert into foo(col1) 
     values(p_in_arr(i)); 
    end loop; 
    select col1*2 
    bulk collect into p_out_arr 
    from foo; 
end; 
/

如果你想存儲陣列

create table bar (
    col1  number, 
    order_by number 
); 

create or replace procedure varray_proc(p_in_arr in float_nt, 
             p_out_arr out float_nt) 
as 
begin 
    for i in 1 .. p_in_arr.count 
    loop 
    insert into bar(col1, order_by) 
     values(p_in_arr(i), i); 
    end loop; 
    select col1*2 
    bulk collect into p_out_arr 
    from bar 
    order by order_by; 
end; 
/
+0

感謝賈斯汀的元素的順序,在我的情況,我會永遠知道在Java數組的長度,我不感興趣的任何關係數組的方面(不需要搜索數組中的元素等)。所以我認爲VARRAY會盡量減少表格。由於數組中元素的順序很重要,上面的代碼是否應該創建另一個列(例如'order')來存儲元素在列中的順序? – ggkmath 2012-03-22 04:00:07

+0

@ggkmath - 我更新了我的答案。使用嵌套表看起來與使用'VARRAY'完全相同,只是沒有硬編碼限制。我還展示了一個存儲索引的例子。 – 2012-03-22 04:09:49

+0

太好了,謝謝Justin!如果我確實知道數組的長度,是否會首選使用varray而不是嵌套表,因爲可以預先定義內存分配?或者,由於某種原因嵌套表首選? – ggkmath 2012-03-22 04:18:04