2010-08-17 45 views
4

我想從我的Java程序中調用Oracle存儲過程。我正在使用JDBC和Spring的StoredProcedure。一些參數是用戶定義的類型,我需要知道如何傳遞它們。如何使用JDBC/Spring調用Oracle存儲過程,其中一些參數類型是用戶定義的?

特別是我應該在參數映射中指定哪種類型(即哪個類型爲java.sql.Types.*)?我應該使用哪種Java類型?問題類型是這樣定義的:

type MyDoubles as varray(50000) of double precision 
type MyStrings as varray(50000) of varchar2(2000) 

回答

0

爲什麼用戶經過雙打和字符串 50000實例 - 這樣Oracle可以進行計算?

這似乎倒退給我。如果用戶已經有了一整天,也許Java可以執行該計算。如果你真的希望Oracle做到這一點,我會說數據應該已經駐留在數據庫中,並且不會傳入。

不會都是java.sql.Type.ARRAY嗎?

+0

我能想到的原因 - 構建應用程序的陣列,通過陣列的PL/SQL程序使用FORALL執行批量PL/SQL操作。不過,我會使用'TABLE OF'和'VARRAY(50000)'來獲得靈活性,但這只是我。 – 2010-08-17 16:07:58

+0

數據庫可以執行哪些操作,但無法在服務器端完成,而不會產生來回的網絡流量成本?如果這是一個長期運行的過程,我希望它是異步的,不管它在哪裏完成。仍然沒有意義。 – duffymo 2010-08-17 16:23:56

1

Google的首次訪問似乎顯示如何綁定VARRAY類型的參數:http://www.devx.com/tips/Tip/22034。本文檔中的示例使用準備好的語句,但對於存儲過程,它應該工作得一樣。

這裏展示的基本概念的摘錄:

String arrayElements[] = { "Test3", "Test4" }; 
PreparedStatement ps = 
    conn.prepareStatement ("insert into sample_varray_table values (?)"); 

ArrayDescriptor desc = ArrayDescriptor.createDescriptor("STRING_VARRAY", conn); 
ARRAY newArray = new ARRAY(desc, conn, arrayElements); 
((OraclePreparedStatement)ps).setARRAY (1, newArray); 

ps.execute(); 

澄清這裏有幾個的FQDN:

  • oracle.sql.ArrayDescriptor
  • oracle.sql.ARRAY
  • 神諭.jdbc.OraclePreparedStatement
0

您可以按照Philipp的建議使用Oracle JDBC驅動程序中的對象。大多數用戶結束創建實用方法來包裝該邏輯。或者他們使用Spring映射器類。不過,還有很多手工工作要做。

另一種方法是使用即將發佈的012.版本的1.5.4--我正在開發的一個開源庫,其中數組均支持統一。所以,當你有你的類型:

type MyDoubles as varray(50000) of double precision 
type MyStrings as varray(50000) of varchar2(2000) 

然後jOOQ將生成類如

public class MyDoubles extends ArrayRecordImpl<Double> { /* ... */ } 
public class MyStrings extends ArrayRecordImpl<String> { /* ... */ } 

你的存儲過程可能是這樣的:

PROCEDURE MY_PROC1 (d IN MyDoubles, s IN MyStrings); 
PROCEDURE MY_PROC2 (d IN MyDoubles, s OUT MyStrings); 
PROCEDURE MY_PROC3 (d OUT MyDoubles, s OUT MyStrings); 

而且jOOQ會產生另一個Java類如

public class Procedures { 

    // Invoke procedure MY_PROC on JDBC Connection c with VARRAY arguments 
    public static void myProc1(Connection c, MyDoubles d, MyStrings s); 

    // The OUT parameter is mapped to a method return value 
    public static MyStrings myProc2(Connection c, MyDoubles d); 

    // MyProc3 is a wrapper for both OUT parameters 
    public static MyProc3 myProc3(Connection c); 
} 

使用生成的代碼構件,使用UDT調用存儲過程,VARRAY參數非常容易。通過源代碼生成,您可以在數據庫模式中更改對象(例如,您的類型或您的過程),並且您的Java類將立即反映該更改。

退房在http://www.jooq.org/manual/META/PROCEDURE/手冊瞭解更多詳情

相關問題