簡體   English   中英

如何使用JDBC / Spring調用Oracle存儲過程,其中一些參數類型是用戶定義的?

[英]How can I call an Oracle stored procedure with JDBC/Spring where some of the parameter types are user defined?

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

特別是我應該在參數映射中指定什么類型(即java.sql.Types.*哪一個)? 我應該使用什么Java類型? 問題類型定義如下:

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

谷歌的首次亮相似乎展示了如何綁定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
  • oracle.jdbc.OraclePreparedStatement

為什么用戶傳遞 50,000個雙精度和字符串實例 - 所以Oracle可以執行計算?

這似乎是我的倒退。 如果用戶已經擁有那一天,也許Java可以執行該計算。 如果您真的希望Oracle這樣做,我會說數據應該已經駐留在數據庫中而不是傳入。

這兩個都不是java.sql.Type.ARRAY嗎?

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

另一種方法是使用即將發布的jOOQ版本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/上的手冊

暫無
暫無

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

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