2012-02-13 236 views
2

我希望通過spring java應用程序將大量「未知」值傳遞給Oracle存儲過程。數據是有點結構化的,所以目前我們有一個存儲過程,它接受2個clob,數據的鍵/值對。第一個clob代表單個記錄和第二個clob,代表許多clob 1的子記錄。Oracle存儲過程結構化參數

這似乎是一種非常低效的方式來傳遞數據,因爲我們必須在forst plave中構建java中的字符串,然後再數據必須在存儲的過程中解析。

我已經查看了Oracle記錄結構,但它看起來好像您必須將記錄結構中的每個字段映射到數據庫表字段。這種方法的問題是:a)我們每次發送的數據項不同(雖然有一組核心數據保持不變),b)某些數據項僅用於決策目的,並非實際堅持到數據庫。

所以我的問題是:什麼是最有效的工具來傳遞這樣的數據到Oracle存儲過程?我們希望保持能夠發送可變參數集以及數據周圍具有某種結構的靈活性。

在此先感謝。

Barry

+1

如果你接受你以前的一些問題的答案,我已經得到了答案! – tbone 2012-02-13 12:37:10

+1

@tbone現在接受答案。希望你的建議:) – 2012-02-13 13:58:12

+0

起初是在思考XMLType的行,但看到盧卡斯的評論你拒絕了這種做法。你能舉一個你需要傳遞給Oracle的數據的例子嗎? – tbone 2012-02-13 14:34:24

回答

3

您是否考慮過將數據作爲XML傳遞給存儲過程? Oracle可以處理XML data types。也有堆棧溢出一些相關的問題:

然而,XML可能在某些情況下,一個性能殺手。另一種選擇是使用REF遊標類型:

PreparedStatement stmt = connection.prepareStatement(
    "DECLARE " 
    + " records SYS_REFCURSOR; " 
    + "BEGIN " 
    + " OPEN records FOR " 
    + " SELECT * FROM TABLE(?); " 
    + " my_proc(records); " 
    + "END;"); 

// Set the records as an array 
stmt.setArray(1, records); 

這將是一個辦法有些結構中的數據,但操作上弱類型遊標。以上選擇可以有任何形式。在這個例子中,我假設你是有約束力的是這樣的:

CREATE TYPE rec AS OBJECT (ID NUMBER(7), VALUE CLOB); 
CREATE TYPE tab AS TABLE OF rec; 

一個簡單的例子程序實現期待TABLE OF VARCHAR2REF CURSOR

CREATE OR REPLACE PROCEDURE my_proc(cur IN SYS_REFCURSOR) IS 
    -- Using a pre-existing TABLE TYPE from the SYS schema for the example 
    array ORA_MINING_VARCHAR2_NT; 
BEGIN 
    FETCH cur BULK COLLECT INTO array; 

    FOR i IN array.FIRST .. array.LAST 
    LOOP 
    DBMS_OUTPUT.PUT_LINE(array(i)); 
    END LOOP; 
END; 

的JDBC結合將被

String[] strings = new String[] {"a", "b", "c"}; 
ArrayDescriptor desc = new ArrayDescriptor("ORA_MINING_VARCHAR2_NT", c); 
ARRAY array = new ARRAY(desc, c, strings); 
stmt.setArray(1, array); 
stmt.executeUpdate(); 

使用TABLE OF OBJECT數據類型,綁定有點棘手...

+0

我應該提到,我們將傳遞數千個這樣的記錄,所以性能是一個問題,因此我們拒絕了xml。 – 2012-02-13 11:23:56

+0

@BazR:我明白了。看到更新的另一個想法 – 2012-02-13 12:47:23

+0

謝謝,這可能是一個選項。我猜想的問題是,我們希望保持數據的靈活性略微非結構化,但以有條理的方式整理數據,保持合理的性能水平。所以有我們的蛋糕和吃它:) – 2012-02-13 14:37:04